我怎样才能创建一个像 objective-c 这样的实例呢?
How can I create a instance like objective-c do?
通常,我会像这样创建一个 class 的实例:
Parent class:
@interface baseClass
+ (instancetype)task;
@end
@implement baseClass
+ (instancetype)task {
return [[[self class] alloc] init];
}
@end
然后在 children class:
@interface childClass : baseClass
@end
@implement childClass
@end
最后,我可以使用以下方法创建一个实例:
childClass *pChild = [childClass task];
如何使用 Swift 编程语言实现此功能?
换句话说,我如何以 swift 的方式实现 [[[self class] alloc] init]
?
在Swift(在每个函数前添加class):
class baseClass: NSObject {
class func task() {
}
}
class childClass: baseClass {
}
let test = childClass.task()
class var sharedInstance :CommonUtil {
struct Singleton {
static let instance = CommonUtil()
}
return Singleton.instance
}
我觉得你把你的问题标记为 单例 有点不安全,但基本上你提供的代码与单例完全无关,所以我试图模仿你的原始代码类 并在此处显示一些选项。
这些写在Swift2.2.
案例 #1
最初完美运行:
class BaseClass {
class func task() -> BaseClass {
return BaseClass()
}
// ...
}
class ChildClass : BaseClass {
override class func task() -> ChildClass {
return ChildClass()
}
// ...
}
那么你将能够得到这样的实例:
let bTask: BaseClass = BaseClass.task()
let cTask: ChildClass = ChildClass.task()
案例#2
你也可以这样做,如果这样的事情对你来说更合理:
class BaseClass {
class var task: AnyObject {
get {
return self.init()
}
}
required init() {
}
// ...
}
class ChildClass : BaseClass {
// ...
}
然后您可以实例化您的 类,例如:
let bTask: BaseClass = BaseClass.task as! BaseClass
let cTask: ChildClass = ChildClass.task as! ChildClass
案例 #3
如果您对以上任何想法都不满意,这里还有一个适合您的选项:
class BaseClass {
class func task() -> Self {
return self.init()
}
required init() {
}
// ...
}
class ChildClass : BaseClass {
// ...
}
实例化类似于第一种情况:
let bTask: BaseClass = BaseClass.task()
let cTask: ChildClass = ChildClass.task()
注意:如果你想处理真正的单例,你可能需要为你的最终代码改进所选的概念,这些例子并不像我一开始提到的那样完美,但它们向你展示了您可以拥有一些选项,您可以将其用作模板。
如果 AClass 不是 NSObject
的子class
class AClass {
required init() {
}
class func task() -> Self {
return self.init()
}
}
class BClass : AClass {
}
let x = BClass.task()
你需要实现 init()
并添加 required
关键字,因为如果想要 subclass BClass
或其他继承自 [=17= 的 class ] 可以使用 task
,你必须确保 subclass 可以使用 init()
;
否则你需要添加final
关键字:
final class AClass {
init() {
}
class func task() -> Self {
return self.init()
}
}
但我认为你不需要它。
如果 AClass 是从 NSObject
继承的,则需要覆盖 init()
并添加 required
:
class AClass : NSObject {
required override init() {
}
class func task() -> Self {
return self.init()
}
}
class BClass : AClass {
}
通常,我会像这样创建一个 class 的实例:
Parent class:
@interface baseClass
+ (instancetype)task;
@end
@implement baseClass
+ (instancetype)task {
return [[[self class] alloc] init];
}
@end
然后在 children class:
@interface childClass : baseClass
@end
@implement childClass
@end
最后,我可以使用以下方法创建一个实例:
childClass *pChild = [childClass task];
如何使用 Swift 编程语言实现此功能?
换句话说,我如何以 swift 的方式实现 [[[self class] alloc] init]
?
在Swift(在每个函数前添加class):
class baseClass: NSObject {
class func task() {
}
}
class childClass: baseClass {
}
let test = childClass.task()
class var sharedInstance :CommonUtil {
struct Singleton {
static let instance = CommonUtil()
}
return Singleton.instance
}
我觉得你把你的问题标记为 单例 有点不安全,但基本上你提供的代码与单例完全无关,所以我试图模仿你的原始代码类 并在此处显示一些选项。
这些写在Swift2.2.
案例 #1
最初完美运行:
class BaseClass {
class func task() -> BaseClass {
return BaseClass()
}
// ...
}
class ChildClass : BaseClass {
override class func task() -> ChildClass {
return ChildClass()
}
// ...
}
那么你将能够得到这样的实例:
let bTask: BaseClass = BaseClass.task()
let cTask: ChildClass = ChildClass.task()
案例#2
你也可以这样做,如果这样的事情对你来说更合理:
class BaseClass {
class var task: AnyObject {
get {
return self.init()
}
}
required init() {
}
// ...
}
class ChildClass : BaseClass {
// ...
}
然后您可以实例化您的 类,例如:
let bTask: BaseClass = BaseClass.task as! BaseClass
let cTask: ChildClass = ChildClass.task as! ChildClass
案例 #3
如果您对以上任何想法都不满意,这里还有一个适合您的选项:
class BaseClass {
class func task() -> Self {
return self.init()
}
required init() {
}
// ...
}
class ChildClass : BaseClass {
// ...
}
实例化类似于第一种情况:
let bTask: BaseClass = BaseClass.task()
let cTask: ChildClass = ChildClass.task()
注意:如果你想处理真正的单例,你可能需要为你的最终代码改进所选的概念,这些例子并不像我一开始提到的那样完美,但它们向你展示了您可以拥有一些选项,您可以将其用作模板。
如果 AClass 不是 NSObject
class AClass {
required init() {
}
class func task() -> Self {
return self.init()
}
}
class BClass : AClass {
}
let x = BClass.task()
你需要实现 init()
并添加 required
关键字,因为如果想要 subclass BClass
或其他继承自 [=17= 的 class ] 可以使用 task
,你必须确保 subclass 可以使用 init()
;
否则你需要添加final
关键字:
final class AClass {
init() {
}
class func task() -> Self {
return self.init()
}
}
但我认为你不需要它。
如果 AClass 是从 NSObject
继承的,则需要覆盖 init()
并添加 required
:
class AClass : NSObject {
required override init() {
}
class func task() -> Self {
return self.init()
}
}
class BClass : AClass {
}