字符串(描述:Int)与字符串(Int)有什么区别?

  • 本文关键字:字符串 Int 区别 描述 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

你的问题实际上是不必要的,因为如果你在这里只想打印,你可以直接做:

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%(这是指CustomStringConvertibledescription属性。

假设init<T>(_:)确实返回descriptionString(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

相关内容

  • 没有找到相关文章

最新更新