我的代码在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'
正如我所说,过去常常有用,我无法理解为什么它不再存在
答案 0 :(得分:4)
没错。声明您的方法返回Self
,而您返回Invoice
。类方法是继承的,在子类中,Self
将是该子类类型,而Invoice
不是该类型的子类型。
要实际返回Self
,假设Invoice
有required 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确保任何子类都将实现静态方法中使用的必需的初始化程序。