如何创建像objective-c这样的实例呢?

时间:2016-06-29 08:26:40

标签: swift singleton-methods

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

父类:

@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 个答案:

答案 0 :(得分: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()

注意:如果您想要处理真正的单身人士,您可能需要优化所选择的最终代码概念,这些示例并不像我在开头提到的那样完美,但它们会向您展示一些选项可以有,你可以用作模板。

答案 1 :(得分: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 {

}

答案 2 :(得分:-1)

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

class baseClass: NSObject {
    class func task() {

    }
}

class childClass: baseClass {

}

let test = childClass.task()

答案 3 :(得分:-1)

class var sharedInstance :CommonUtil {
    struct Singleton {
        static let instance = CommonUtil()
    }

    return Singleton.instance
}