有很多不同的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 ,其中包含指向文档的链接,这是我之前没有找到的(是的,很可能是我蒙蔽了眼睛,它为我节省了几个小时:-)
对于“愚蠢”的问题,我向你们其他人表示敬意。
答案 0 :(得分:3)
摘自Double
失败的init
文档:
十六进制值包含有效位
0X
或0x
,后跟一系列十六进制数字。有效位可以包含小数点。
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 |