1

通常,我会像这样创建一个类的实例:

父类:

@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]快速实现?

4

4 回答 4

0

我对您将问题标记为单例感到有些不安全,但基本上您提供的代码与单例完全无关,因此我尝试模仿您的原始类并在此处显示一些选项。

这些是用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()

注意:如果你想处理真正的单例,你可能需要为你的最终代码改进选择的概念,这些例子并不像我在开头提到的那样完美,但它们向你展示了一些你可以拥有的选项,你可以使用作为模板。

于 2016-06-29T08:33:20.960 回答
0

如果 AClass 不是的子类NSObject

class AClass {
    required init() {

    }
    class func task() -> Self {
        return self.init()
    }
}

class BClass : AClass {

}

let x = BClass.task()

您需要实现init()并添加required关键字,因为如果要BClass继承的子类或其他类AClass可以使用task,您必须确保子类可以使用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 {

}
于 2016-06-29T09:41:34.330 回答
-1

在 Swift(在每个函数之前添加类):

class baseClass: NSObject {
    class func task() {

    }
}

class childClass: baseClass {

}

let test = childClass.task()
于 2016-06-29T08:28:43.587 回答
-1
class var sharedInstance :CommonUtil {
    struct Singleton {
        static let instance = CommonUtil()
    }

    return Singleton.instance
}
于 2016-06-29T08:32:34.093 回答