Zoo*_*ooz 42 objective-c swift
我想对某个类进行扩展以返回运行时类型对象
例如,我创建了A类的扩展
extension A {
class func niceObject() -> XXXXX { // in objective-c is instancetype
return ....
}
}
Run Code Online (Sandbox Code Playgroud)
所以任何人都知道Swift中有instancetype关键字或者不替换xxxxx,我可以在A的子类上调用此函数而无需手动转换
var b: B = B.niceObject()
Run Code Online (Sandbox Code Playgroud)
谢谢
Gri*_*mxn 42
你能行的.游乐场代码如下.它是self(),niceObject()必须返回.此外,您必须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
Run Code Online (Sandbox Code Playgroud)
Sul*_*han 20
Self在两个地方都有一个关键字- 在协议中(参见Jean-Philippe Pellet的答案)和class方法的结果:
extension A {
class func niceObject() -> Self? {
return nil
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这对您没有帮助,因为以下内容无效
extension A {
class func niceObject() -> Self? {
//A can't be converted to Self
return A()
}
}
Run Code Online (Sandbox Code Playgroud)
该错误是由您继承的事实引起的 A
class B : A {
}
Run Code Online (Sandbox Code Playgroud)
然后
var b = B.niceObject()
Run Code Online (Sandbox Code Playgroud)
实际上会返回一个A不可转换为Self(Selfis B)的实例
@Grimxn找到了正确的解决方案(见他的回答):
您必须向基类添加所需的初始化程序,例如
class A {
@required init() {
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以使用调用初始化程序 self()
extension A {
class func niceObject() -> Self {
return self()
}
}
Run Code Online (Sandbox Code Playgroud)
Jea*_*let 10
至少在procotols中,你可以使用Self.这代表了实际的类型self.不确定扩展,但......
例如,请参阅以下定义Equatable:
protocol Equatable {
func ==(lhs: Self, rhs: Self) -> Bool
}
Run Code Online (Sandbox Code Playgroud)