泛型的最终自我 class,在方法签名中,在 Swift 中
Final self class for generics, in method signature, in Swift
我有一个 BaseObject
模型,它定义了我想在所有数据实体之间共享的常见行为。它有一个这样的方法:
class BaseObject {
static func fetch(block: ((Results<BaseObject>) -> Void)) {
// networking code here
}
}
当然,我需要此方法的签名足够动态,以便 class Products
的模型
class Products: BaseObject { //...
生成 Results<Product>
列表而不是 Results<BaseObject>
。我不想在每个 subclass 中重新实现 fetch
方法,因为除了正文和签名中使用的确切最终 subclass 名称外,它会完全相同。
我无法使用 Self
:
我有什么选择吗?
您现在可以从 Swift 2.0 开始执行此操作,因为它允许在协议中默认实现方法。为此,您可以使基础 class 成为一个协议,并使用 Self,就像您在示例中尝试的那样。
编辑:
这在 Swift 2.0 / Xcode 7.0 Beta 中编译:
class Results<T> {
}
protocol BaseObject {
static func fetch(block: ((Results<Self>) -> Void))
}
extension BaseObject {
static func fetch(block: ((Results<Self>) -> Void)) {
// networking code here
}
}
此功能仅在Swift 2.0 中可用,据我所知,在Swift 1.2 或更早版本中没有解决方案。
我有一个 BaseObject
模型,它定义了我想在所有数据实体之间共享的常见行为。它有一个这样的方法:
class BaseObject {
static func fetch(block: ((Results<BaseObject>) -> Void)) {
// networking code here
}
}
当然,我需要此方法的签名足够动态,以便 class Products
class Products: BaseObject { //...
生成 Results<Product>
列表而不是 Results<BaseObject>
。我不想在每个 subclass 中重新实现 fetch
方法,因为除了正文和签名中使用的确切最终 subclass 名称外,它会完全相同。
我无法使用 Self
:
我有什么选择吗?
您现在可以从 Swift 2.0 开始执行此操作,因为它允许在协议中默认实现方法。为此,您可以使基础 class 成为一个协议,并使用 Self,就像您在示例中尝试的那样。
编辑:
这在 Swift 2.0 / Xcode 7.0 Beta 中编译:
class Results<T> {
}
protocol BaseObject {
static func fetch(block: ((Results<Self>) -> Void))
}
extension BaseObject {
static func fetch(block: ((Results<Self>) -> Void)) {
// networking code here
}
}
此功能仅在Swift 2.0 中可用,据我所知,在Swift 1.2 或更早版本中没有解决方案。