一个游乐场只包含一个符合ExpressibleByStringLiteral的NSDecimalNumber扩展名和一个试图利用该扩展名的变量x,并且LLDB RPC服务器崩溃:
import Cocoa
extension NSDecimalNumber: ExpressibleByStringLiteral {
init(stringLiteral value: Self.StringLiteralType) {
self.init(string: value)
}
}
let x: NSDecimalNumber = "1.2"
提交Apple Radar和OpenRadar:https://openradar.appspot.com/31556528
答案 0 :(得分:1)
虽然这是应该报告的编译器的错误,但您的扩展在许多级别上都是错误的。
ExpressibleByStringLiteral
有两个必须实施的父协议。
您没有为协议关联类型(typealias
)声明StringLiteralType
。
您不能使用Self.
外部协议声明。
初始值设定项必须为public
。
您只能在扩展程序中声明convenience
初始值设定项,而不是指定的初始化程序。
实现初始化程序的唯一方法是在类定义中使用required
初始化程序。
总之,您无法在扩展名中声明与此协议的一致性。
为什么这是一个坏主意:
NSDecimalNumber
初始化程序是区域设置依赖项。这意味着您的代码行为将根据当前区域设置而改变。
在Swift中,我们应该使用Decimal
代替NSDecimalNumber
。