我如何返回在Swift的instancetype

我想做一些类的扩展来返回运行时types对象

例如,我创build了类A的扩展

extension A { class func niceObject() -> XXXXX { // in objective-c is instancetype return .... } } 

所以任何人都知道在Swift中有实例types关键字或不能replacexxxxx ,我可以在A的子类上调用这个函数,而无需手动转换

 var b: B = B.niceObject() 

谢谢

你能行的。 下面的游乐场代码。 nice()必须返回self()。 另外,你必须在基类上有一个required init。

 class A { required init() { } func whatClassAmI() -> String { return "Class A" } } class B: A { required init() { super.init() } override func whatClassAmI() -> String { return "Class B" } } let a = A() let sa = a.whatClassAmI() // "Class A", of course let b = B() let sb = b.whatClassAmI() // "Class B", of course extension A { class func niceObject() -> Self { return self.init() } } let aa = A.niceObject() let saa = aa.whatClassAmI() // "Class A" let bb = B.niceObject() let sbb = bb.whatClassAmI() // "Class B", as required 

关键字Self可以在两个地方被允许 – 在协议中(请参阅Jean-Philippe Pellet的答案),并且是class方法的结果:

 extension A { class func niceObject() -> Self? { return nil } } 

不幸的是,这不会帮助你,因为以下是无效的

 extension A { class func niceObject() -> Self? { //A can't be converted to Self return A() } } 

这个错误是由于你从Ainheritance而来A

 class B : A { } 

然后

 var b = B.niceObject() 

实际上会返回一个不能转换为Self实例( Self is B

@Grimxnfind了正确的解决scheme( 请参阅他的回答 ):

你必须添加一个必要的初始化器到基类,例如

 class A { @required init() { } } 

然后你可以使用self()来调用初始化程序

 extension A { class func niceObject() -> Self { return self() } } 

至less在procotols,你可以使用Self 。 这代表了self的实际types。 不知道有关扩展,但…

例如,请参阅Equatable的定义:

 protocol Equatable { func ==(lhs: Self, rhs: Self) -> Bool } 

当您从Objective-C使用Swift API时,编译器通常执行直接转换。 例如,在Objective-C中,Swift API func playSong(name: String)被导入为- (void)playSong:(NSString *)name

但是,有一个例外:在Objective-C中使用Swift初始化器时,编译器将文本“ initWith ”添加到方法的开头,并正确初始化初始化器中的第一个字符。

例如,在Objective-C中,这个Swift初始化器init (songName: String, artist: String)被导入为- (instancetype)initWithSongName:(NSString *)songName artist:(NSString *)artist