有人知道,为什么还要编译?

时间:2019-02-27 17:34:34

标签: swift

有很多不同的Double初始值设定项,但除了String作为参数外,任何其他初始化项都应如此。

为什么要编译(并返回一个值!)???

if let d = Double("0xabcdef10.abcdef10") {
    print(d)
}

它打印

2882400016.671111

不需要导入,请检查您的环境...

更新 谢谢大家,我的麻烦是不了解如何将Double值表示为十六进制字符串。

我对不一致的实现感到困惑

protocol LosslessStringCovertible

 init?(_:) REQUIRED
 Instantiates an instance of the conforming type from a string representation.

 Declaration
 init?(_ description: String)

Double和Int都符合LosslessStringCovertible(通过与FixedWidthInteger的符合间接实现Int)

一开始我是从

开始的
public func getValue<T: LosslessStringConvertible>(_ value: String)->T {
    guard let ret = T.init(value) else {
        // should never happen
        fatalError("failed to assign to \(T.self)")
    }
    return ret
}
// standart notation
let id: Int = getValue("15")
// hexadecimal notation
let ix: Int = getValue("0Xf") // Fatal error: failed to assign to Int

好的,这是实现细节,所以我决定由我自己实现,接受二进制,oktal,十六进制表示法的字符串

接下来,我对Double进行了同样的操作,并通过测试对它进行了测试,发现当我忘记导入LosslessStringConvertibleExt时,我的测试通过了预期的Double,字符串以十六进制和十进制表示。

谢谢您 LeoDabus ,其中包含指向文档的链接,这是我之前没有找到的(是的,很可能是我蒙蔽了眼睛,它为我节省了几个小时:-)

对于“愚蠢”的问题,我向你们其他人表示敬意。

2 个答案:

答案 0 :(得分:3)

摘自Double失败的init文档:

  

十六进制值包含有效位0X0x,后跟一系列十六进制数字。有效位可以包含小数点。

     

let f = Double("0x1c.6") // f == 28.375

因此,给定0xabcdef10.abcdef10前缀,0x被解释为十六进制数。

答案 1 :(得分:0)

该字符串被解释为小数十六进制。这是十进制值的计算方式:

| Hex Digit | Decimal Value | Base Multipler | Decimal Result            |
|-----------|---------------|----------------|---------------------------|
| a         | 10            | x 16 ^ 7       |  2,684,354,560.0000000000 |
| b         | 11            | x 16 ^ 6       |    184,549,376.0000000000 |
| c         | 12            | x 16 ^ 5       |     12,582,912.0000000000 |
| d         | 13            | x 16 ^ 4       |        851,968.0000000000 |
| e         | 14            | x 16 ^ 3       |         57,344.0000000000 |
| f         | 15            | x 16 ^ 2       |          3,840.0000000000 |
| 1         | 1             | x 16 ^ 1       |             16.0000000000 |
| 0         | 0             | x 16 ^ 0       |              0.0000000000 |
| .         |               |                |                           |
| a         | 10            | x 16 ^ -1      |              0.6250000000 |
| b         | 11            | x 16 ^ -2      |              0.0429687500 |
| c         | 12            | x 16 ^ -3      |              0.0029296875 |
| d         | 13            | x 16 ^ -4      |              0.0001983643 |
| e         | 14            | x 16 ^ -5      |              0.0000133514 |
| f         | 15            | x 16 ^ -6      |              0.0000008941 |
| 1         | 1             | x 16 ^ -7      |              0.0000000037 |
| 0         | 0             | x 16 ^ -8      |              0.0000000000 |
--------------------------------------------------------------------------
| Total     |               |                |  2,882,400,016.6711100000 |