扩展NSDecimalNumber以符合ExpressibleByStringLiteral会导致LLDB RPC服务器崩溃

时间:2017-04-11 15:19:17

标签: swift string-literals swift-extensions

一个游乐场只包含一个符合ExpressibleByStringLiteral的NSDecimalNumber扩展名和一个试图利用该扩展名的变量x,并且LLDB RPC服务器崩溃:

import Cocoa

extension NSDecimalNumber: ExpressibleByStringLiteral {
    init(stringLiteral value: Self.StringLiteralType) {
        self.init(string: value)
    }
}



let x: NSDecimalNumber = "1.2"
  • Swift 3
  • Xcode 8.2.1(8C1002)
  • OS X El Capitan 10.11.6(15G1421)

提交Apple Radar和OpenRadar:https://openradar.appspot.com/31556528

1 个答案:

答案 0 :(得分:1)

虽然这是应该报告的编译器的错误,但您的扩展在许多级别上都是错误的。

  1. ExpressibleByStringLiteral有两个必须实施的父协议。

  2. 您没有为协议关联类型(typealias)声明StringLiteralType

  3. 您不能使用Self.外部协议声明。

  4. 初始值设定项必须为public

  5. 您只能在扩展程序中声明convenience初始值设定项,而不是指定的初始化程序。

  6. 实现初始化程序的唯一方法是在类定义中使用required初始化程序。

  7. 总之,您无法在扩展名中声明与此协议的一致性。

    为什么这是一个坏主意:

    1. NSDecimalNumber初始化程序是区域设置依赖项。这意味着您的代码行为将根据当前区域设置而改变。

    2. 在Swift中,我们应该使用Decimal代替NSDecimalNumber