Swift协议定义返回self的类方法

时间:2014-10-07 20:30:35

标签: swift protocols

我的代码在XCode 6测试版中有效,但在更新到xcode 6.1后最近停止了工作。

这是我的协议:

protocol CanDeserialiseFromJson {
    class func FromJson(json : JSONValue) -> Self
}

这是实施:

extension Invoice : CanDeserialiseFromJson {
    class func FromJson(json : JSONValue) -> Self {
        return Invoice()
    }
}

这没有给出错误:

'Invoice' is not convertable to 'Self'

正如我所说,过去常常有用,我无法理解为什么它不再存在

3 个答案:

答案 0 :(得分:4)

没错。声明您的方法返回Self,而您返回Invoice。类方法是继承的,在子类中,Self将是该子类类型,而Invoice不是该类型的子类型。

要实际返回Self,假设Invoicerequired init()构造函数,您可以执行以下操作:

extension Invoice : CanDeserialiseFromJson {
    class func FromJson(json : JSONValue) -> Self {
        return self()
    }
}

答案 1 :(得分:2)

协议中的

Self要求协议的实现使用自己的类型。由于Invoice是您采用协议的类型,因此FromJson的实现应具有Invoice的返回类型。

答案 2 :(得分:1)

如果您确实需要返回Self(在我的情况下,我有一个Objective-C协议,该协议将方法转换为返回Self的快速函数)并且没有将您的类标记为final,则需要创建所需的初始化程序并使用:

class Foo {
    static func bar() -> Self {
        return self.init()
    }

    required init() {

    }
}

最终/必需的要求来自于以下事实:您可能将此类归为一类并具有不同的初始化程序。 Final删除了子类的选项,而必需的init确保任何子类都将实现静态方法中使用的必需的初始化程序。