Swift中方法签名中泛型的最终自定义

时间:2015-06-22 22:44:02

标签: swift generics reflection

我有一个BaseObject模型,用于定义我想要在所有数据实体中共享的常见行为。它有这样的方法:

class BaseObject {
    static func fetch(block: ((Results<BaseObject>) -> Void)) {
        // networking code here
    }
}

当然,我需要这个方法的签名足够动态,以便类Products的模型

class Products: BaseObject { //...

产生Results<Product>列表而不是Results<BaseObject>。我不想在每个子类中重新实现fetch方法,因为除了在正文和签名中使用的确切的最终子类名称外,它将是相同的。

我无法使用Self

Xcode error

我有任何选择吗?

1 个答案:

答案 0 :(得分:1)

现在,您可以在Swift 2.0中执行此操作,因为它允许在协议中默认实现方法。为此,您可以将基类作为协议,并使用Self,就像您在示例中所尝试的那样。

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html#//apple_ref/doc/uid/TP40014097-CH25-ID521

编辑:

这在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或之前没有解决方案。