假设我有一个异步任务来抓取像这样的实例数组:
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
}
}
这可能是不可能的,但我认为值得一提。
答案 0 :(得分:1)
根据'Self' is only available in a protocol or as the result of a class method和Use 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
// ...
}