Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何创建像objective-c这样的实例?_Swift_Singleton Methods - Fatal编程技术网

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 {

}