我如何返回在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() } }
这个错误是由于你从A
inheritance而来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
。