“Swift 编程语言”包含以下示例代码:
let label = "The width is "
let width = 94
let widthLabel = label + String(width)
当我将 width
隐式更改为 Double 时:
let width = 94.4
针对 let widthLabel = label + String(width)
: 行创建编译器错误:
Cannot invoke '+' with an argument list of type (String, String)
虽然我可以通过调用 width.description
将 Double
var 转换为 String
,但我想知道:
- 为什么
String(Integer)
有效,但String(Double)
无效? - 在数字类型(Integer、Float、Double 等)上调用
String(var)
和var.description
之间有什么区别吗?
最佳答案
你不能这样做的原因是因为 String
没有接受 double 或 float 的初始值设定项,而它实现了所有整数类型的初始值设定项(Int、Uint、Int32、等)。
所以@derdida的解决方案是正确的方法。
我不鼓励使用description
属性。它不意味着将 double 转换为字符串,而是提供人类可读的 double 文本表示。因此,尽管今天的表示与转换一致:
let width = 94.5
println(width) // Prints "94.5"
明天可以更改为不同的内容,例如:
ninety four point five
这仍然是人类可读的,但它并不完全是 double 到字符串的转换。
此规则对于实现 Printable
协议(protocol)的所有类型(结构、类等)均有效:description
属性应用于描述,而不是转换。
附录
除了使用字符串插值之外,我们还可以使用旧的类似 C 的字符串格式:
let pi = 3.1415
let piString = String(format: "%0.2f", arguments:[pi])
let message = "Pi is " + String(format: "%0.2f", arguments:[pi])
println(message)
关于swift - 无法将 double 转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38081711/