instancetype参数在子类的闭包/回调中键入

时间:2015-06-02 22:15:26

标签: swift closures

假设我有一个异步任务来抓取像这样的实例数组:

class func fetchListOfInstances(callback: ([MySuperClass])->()) {
    // do long task asynchronously and call the callback
}

这可以像这样使用:

MySubclass.fetchListOfInstances() { myList in // myList inferred as [MySuperClass]
     for whatever in myList {
         let typeIReallyWant = whatever as! MySubclass
         // do stuff here with each instance of typeIReallyWant
     }
}
斯威夫特似乎对类型看起来非常聪明,所以如果不能做出类似的事情,我会感到惊讶,但我无法从谷歌搜索中找到任何东西:

class func fetchListOfInstances(callback: ([Self])->()) {
    // do long task asynchronously and call the callback
}

...

MySubclass.fetchListOfInstances() { myList in // myList inferred as [MySubclass]
     for whatever in myList {
         // do stuff here with each instance of whatever
     }
}

这可能是不可能的,但我认为值得一提。

1 个答案:

答案 0 :(得分:1)

根据'Self' is only available in a protocol or as the result of a class methodUse Self as generic type,您现在似乎无法实现目标。相反,你可以使用一个函数,例如:

func fetchInstances<T: MySuperClass>(callback: [T] -> Void) {
    // Do long task asynchronously and call the callback.
}

在上述函数中的某个时刻,您可能会创建T的实例。在这种情况下,您需要MySuperClass中所需的初始化程序;意味着MySuperClass的所有子类也必须实现该初始化。例如:

class MySuperClass {
    required init(arg: String) {
        // ...
    }
}

您现在可以在T(arg: "...")中使用fetchInstances,因为您知道 T实施init(arg: String)

最后,您可以致电fetchInstances,明确说明myList的类型,以便Swift知道T的类型。

fetchInstances { (myList: [MySubClass]) in
    // ...
}