【发布时间】:2018-03-13 08:25:25
【问题描述】:
我正在尝试编写一个扩展来满足扩展中的协议,如下所示:
extension UIColor: JSONRepresentable {
convenience init?(json: Any) {
guard let colourArray = json as? [CGFloat] else {
print("json was not an array of CGFloats")
return nil
}
self.init(
red: colourArray[0],
green: colourArray[1],
blue: colourArray[2],
alpha: colourArray[3]
)
}
}
我收到此错误:
Initializer requirement 'init(json:)' can only be satisfied by a required initializer in the definition of non-final class 'UIColor'.
如果我添加 required 关键字,我会收到此错误
'required' initializer must be declared directly in class 'UIColor' (not in an extension).
是否有原因或任何解决方法?
编辑:为了清楚起见,这是协议
protocol JSONRepresentable {
init?(json: Any)
}
【问题讨论】:
-
您使用的是哪个 swift 版本,在 Swift4 中您的代码对我来说编译得很好?虽然我不得不删除
JSONRepresentable一致性,因为我在操场上进行测试,但这应该会有所作为 -
我也在使用 Swift4。我刚刚阐明了协议要求。这有什么不同吗?
-
@DávidPásztor 这就是其中的关键部分。从协议实现初始化程序时,
required必须存在。 -
对,但是当我添加它时,我得到第二个错误:
'required' initializer must be declared directly in class 'UIColor' (not in an extension)。抱歉,如果问题中没有明确说明。 -
为什么不创建一个
struct Color: Codable,添加这4 个属性(红色、绿色、蓝色和alpha),然后添加一个计算属性以从中返回一个UIColor?不用从 CGFloats 数组初始化它,只需使用字典let json = """ {"red": 1.0, "green": 0.0, "blue": 0.0, "alpha": 1.0} """