如何在Swift中返回instancetype

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)

  • 在我个人的情况下,我必须做同样的`扩展A {class func niceObject() - > [Self] {//做东西返回MyArrayOfSelf}}`</ br>它不起作用,不幸的是 (2认同)

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)