我需要将Integer
值转换为String
.我用Integer
值创建了一个变量,然后我使用print
打印了它。以下方法之间有什么区别?
var word = "Count is "
var count = 100
print(word+String(describing: count)); // Count is 100
print(word+String(count)); // Count is 100
你的问题实际上是不必要的,因为如果你在这里只想打印,你可以直接做:
print("Count is", count) // Count is 100
这是因为print
采用可变参数并插入空格作为默认分隔符。
但是,无论如何,让我们回答这个问题。
答
这就是胁迫和代表的区别。
胁迫。某些类型可以更改为某些其他类型。您可以将双精度更改为 int,将 int 更改为双精度。您可以将 Int 更改为字符串,将字符串(可能(更改为 Int。这是可能的,因为第二种类型具有初始值设定项,其参数是第一种类型。这是您在实际程序中要执行的操作,如下所示:
let sum : Int = x + y
self.myLabel.text = "Your total is (String(sum))"
表示。出于调试目的,所有类型都可以从可表示为字符串中受益。假设您有一个人员类型。您不能将人员更改为字符串,反之亦然 - 这毫无意义 - 但您肯定希望能够将人员print
控制台以查看您是否获得了正确的结果。这是可能的,因为 Person 类型本身提供了可打印的说明。这是出于调试目的而执行的操作:
let p = Person(first:"Matt", last:"Neuburg")
print("p is (String(describing:p))")
评论
评论 1.这种区别在 Swift 中是相当新的。过去,String(...)
被用来表达这两个概念。但是,要认识到这是两种不同机制的混淆。所以如今,尝试编写String(p)
会失败,而以前它会成功。字符串没有 Person 初始值设定项,因此禁止String(p)
;你现在必须明确地说,你是在描述,而不是胁迫。
评论 2.打印描述的需求非常普遍,如果您只想记录对象本身,则不必通过String(describing:)
。你可以写print(p)
,因为这是print(String(describing:p))
的简写。同样,字符串内插调用String(describing:)
为您服务,因此您可以编写print("p is (p)")
。而且,正如我在开始时所说,print
采用一个可变参数并插入空格作为默认分隔符,因此您可以编写print("p is", p)
。
阅读文档可能会有所帮助!
以下是String.init(describing:)
的摘录
使用此初始值设定项将任何类型的实例转换为其 字符串实例的首选表示形式。初始值设定项创建
instance
的字符串表示形式,采用以下方式之一, 根据其协议一致性:
- 如果实例符合
TextOutputStreamable
协议,则通过对空字符串调用instance.write(to: s)
来获取结果 s.- 如果实例符合
CustomStringConvertible
协议,则结果为instance.description
。- 如果实例符合
CustomDebugStringConvertible
协议,则结果为instance.debugDescription
。- 未指定的结果由 Swift 标准库自动提供。
Int
符合CustomStringConvertible
,所以String(describing: someInt)
和someInt.description
一样。
现在让我们看一下String(someInt)
,这调用了这个初始值设定项:
public init<T>(_ value: T) where T : LosslessStringConvertible
Int
也符合LosslessStringConvertible
。事实上,LosslessStringConvertible
继承自CustomStringConvertible
.LosslessStringConvertible
仅指定一个要求 - 采用字符串的初始值设定项。
init<T>(_:)
的文档是这样说的:
根据给定
LosslessStringConvertible
实例的说明创建实例。
即使description
不是等宽字体,我也很确定(尽管不是 100%(这是指CustomStringConvertible
的description
属性。
假设init<T>(_:)
确实返回description
,String(describing: someInt)
总是返回与String(someInt)
相同的值。
请注意,这并不适用于所有类型。它仅适用于符合LosslessStringConvertible
的类型,但不适用于TextOutputStreamable
。如果具有同时符合两者的类型,则结果可能会有所不同:
struct A: TextOutputStreamable, LosslessStringConvertible {
init?(_ description: String) { }
init() { }
var description: String {
return "foo"
}
func write<Target>(to target: inout Target) where Target : TextOutputStream {
target.write("bar")
}
}
String(describing: A()) // bar
String(A()) // foo