我需要将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
答案 0 :(得分:5)
您的问题实际上是不必要的,因为如果您想在此处所有打印,您可以直接执行此操作:
print("Count is", count) // Count is 100
这是因为print
采用可变参数并将空格作为默认分隔符。
然而,我们无论如何都要回答这个问题。
这是强制和表示之间的区别。
<强>胁迫即可。某些类型可以更改为某些其他类型。您可以将Double更改为Int,将Int更改为Double。您可以将Int更改为String,将String(可能)更改为Int。这是可能的,因为第二种类型具有初始化器,其参数是第一种类型。这是您在实际程序中所做的事情,如下所示:
let sum : Int = x + y
self.myLabel.text = "Your total is \(String(sum))"
<强>表示即可。出于调试目的,所有类型都可以从可表示为字符串中受益。假设你有一个Person类型。你不能将Person更改为String,反之亦然 - 这没有任何意义 - 但你肯定希望能够print
一个人到控制台来查看你是否得到了正确的结果。这是可能的,因为Person类型本身提供了可打印的描述。这是用于调试目的:
let p = Person(first:"Matt", last:"Neuburg")
print("p is \(String(describing:p))")
评论1 。这种区别在Swift中是相当新的。曾经是String(...)
被用来表达这两个概念。但是,实现这两种截然不同机制的混乱的权力。所以现在,尝试编写String(p)
将会失败,而早些时候它会成功。 String没有Person初始值设定项,因此禁止String(p)
;你现在必须说明确地你描述,而不是强制。
评论2 。打印描述的需求非常普遍,如果您只想记录对象本身,则不必通过String(describing:)
。您可以撰写print(p)
,因为这是print(String(describing:p))
的简写。同样,字符串插值为您调用String(describing:)
,因此您可以编写print("p is \(p)")
。而且,正如我在开始时所说,print
采用可变参数并将空格作为默认分隔符,因此您可以编写print("p is", p)
。
答案 1 :(得分:1)
阅读文档可能有所帮助!
使用此初始化程序将任何类型的实例转换为其 首选表示形式为String实例。初始化程序创建
instance
的字符串表示形式,有以下几种方式, 取决于其协议一致性:
- 如果实例符合
TextOutputStreamable
协议,则通过在空字符串上调用instance.write(to: 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>(_:)
的{{3}}说明了这一点:
根据给定
LosslessStringConvertible
实例的描述创建实例。
即使description
不是等宽字体,我也很确定(尽管不是100%)这指的是description
的{{1}}属性。
假设CustomStringConvertible
确实返回init<T>(_:)
,description
始终返回与String(describing: someInt)
相同的值。
请注意,并非所有类型都适用。它仅适用于符合String(someInt)
但不符合LosslessStringConvertible
的类型。如果您的类型符合两者,则结果可能不同:
TextOutputStreamable