Swift 如何创建像objective-c这样的实例?
通常,我创建一个类的实例,如下所示:Swift 如何创建像objective-c这样的实例?,swift,singleton-methods,Swift,Singleton Methods,通常,我创建一个类的实例,如下所示: let bTask: BaseClass = BaseClass.task() let cTask: ChildClass = ChildClass.task() 父类: @interface baseClass + (instancetype)task; @end @implement baseClass + (instancetype)task { return [[[self class] alloc] init];
let bTask: BaseClass = BaseClass.task()
let cTask: ChildClass = ChildClass.task()
父类:
@interface baseClass
+ (instancetype)task;
@end
@implement baseClass
+ (instancetype)task {
return [[[self class] alloc] init];
}
@end
然后在儿童课上:
@interface childClass : baseClass
@end
@implement childClass
@end
最后,我可以使用以下方法创建一个实例:
childClass *pChild = [childClass task];
如何使用Swift编程语言实现此功能
换言之,我如何以快速的方式实现[[[self class]alloc]init]?在每个函数之前快速添加类:
class baseClass: NSObject {
class func task() {
}
}
class childClass: baseClass {
}
let test = childClass.task()
我对您将问题标记为单例感到有点不安全,但基本上您提供的代码与单例无关,因此我尝试模仿您的原始类,并在此处显示一些选项 这些都是用Swift 2.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的子类
您需要实现init并添加必需的关键字,因为如果希望子类BClass或从AClass继承的其他类可以使用task,您必须确保子类可以使用init
否则,您需要添加final关键字:
但我想你不需要它
如果AClass是从NSObject继承的,则需要重写init并添加required:
这里的OP不是针对单身人士的。非常感谢!案例3适合我。再次谢谢你!我认为Swift的语法有很多误解。所以我已经困惑了很多次了。@imeeora,没问题,我将把其他两个选项也留在这里;谁知道呢,也许将来会有人用。
class AClass {
required init() {
}
class func task() -> Self {
return self.init()
}
}
class BClass : AClass {
}
let x = BClass.task()
final class AClass {
init() {
}
class func task() -> Self {
return self.init()
}
}
class AClass : NSObject {
required override init() {
}
class func task() -> Self {
return self.init()
}
}
class BClass : AClass {
}