我怎样才能创建一个像 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 {

}