String(描述:Int)与String(Int)之间有什么不同?

时间:2018-06-09 12:23:59

标签: swift

我需要将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

2 个答案:

答案 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.init(describing:)

  

使用此初始化程序将任何类型的实例转换为其   首选表示形式为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继承自CustomStringConvertibleLosslessStringConvertible只指定一个需求 - 一个带字符串的初始化程序。

init<T>(_:)的{​​{3}}说明了这一点:

  

根据给定LosslessStringConvertible实例的描述创建实例。

即使description不是等宽字体,我也很确定(尽管不是100%)这指的是description的{​​{1}}属性。

假设CustomStringConvertible确实返回init<T>(_:)description始终返回与String(describing: someInt)相同的值。

请注意,并非所有类型都适用。它仅适用于符合String(someInt)但不符合LosslessStringConvertible的类型。如果您的类型符合两者,则结果可能不同:

TextOutputStreamable