2017-04-11 17 views
0

甲操场仅包含NSDecimalNumber的扩展,它符合ExpressibleByStringLiteral并试图利用该扩展名的变量x,并且LLDB RPC服务器崩溃:扩展NSDecimalNumber以符合ExpressibleByStringLiteral崩溃LLDB RPC服务器

import Cocoa 

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



let x: NSDecimalNumber = "1.2" 

  • 夫特3
  • 的Xcode 8.2.1(8C1002)
  • OS X埃尔卡皮坦10.11.6(15G1421)

提起对苹果雷达和OpenRadar:https://openradar.appspot.com/31556528

回答

1

虽然这是应该报告编译器的一个bug,你的扩展是错误在许多层面上。

  1. ExpressibleByStringLiteral有两个父协议也必须实现。

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

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

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

  5. 您只能在扩展中声明convenience初始值设定项,不指定初始值设定项。

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

总之,您不能在扩展中声明与此协议一致。

为什么这是一个坏主意:

  1. NSDecimalNumber初始化程序语言环境dependendent。这意味着你的代码行为会根据当前的语言环境而改变。

  2. 在Swift中,我们应该使用Decimal而不是NSDecimalNumber

+0

请注意,OP提出的建议与您的建议有什么区别。主要地,'NSDecimalNumber'或者'Decimal'可以精确地代表“1.2”,而经过一个不能精确表示1.2的double会导致不同的结果。 –

+0

@DavidBerry你是对的,我希望有一个更好的'十进制'初始化,但你是正确的,它再次通过浮点。 – Sulthan

+0

也许更重要的'十进制=十进制(字符串:“1.2”)'产生不同的结果从'十进制=十进制(字符串:“1.20”)' –