Swift 为什么可以’;t斯威夫特&x2019;s字符串构造函数是否用于将泛型转换为字符串?

Swift 为什么可以’;t斯威夫特&x2019;s字符串构造函数是否用于将泛型转换为字符串?,swift,generics,Swift,Generics,考虑下面的例子 func printGeneric<T>(_ input: T) { let output = String(input) print(output) } 为什么第一种方法不起作用,而第二种方法起作用?获取泛型的字符串表示的“正确”方法是什么?如何 func printGeneric<T>(_ input: T) { let output = String(describing:input) print(output) }

考虑下面的例子

func printGeneric<T>(_ input: T) {
    let output = String(input)
    print(output)
}
为什么第一种方法不起作用,而第二种方法起作用?获取泛型的字符串表示的“正确”方法是什么?

如何

func printGeneric<T>(_ input: T) {
    let output = String(describing:input)
    print(output)
}
func printGeneric(uu输入:T){
让输出=字符串(描述:输入)
打印(输出)
}
至于原因:

  • 第一种方法,
    String(x)
    ,用于特定情况,
    x
    属于可以强制为String的类型,以便在程序中使用。换句话说,它是一种类型,其中每个值都有一个等价的字符串,如
    1
    “1”
    。我们不知道t是否是那种类型,因此编译失败

  • 但是
    String(description:x)
    “\(x)”
    完全相同-用于将任何内容打印到控制台。它不是强制,而是字符串表示


您还可以选择使用
字符串(反射:)
;它与
String(description:)

有着微妙的不同。如果能够对正在定义的一组类型说
String(T)
对您来说很重要,那么您可以声明一个协议,为该协议类型定义一个字符串初始值设定项,并用该协议类型约束T。
func printGeneric<T>(_ input: T) {
    let output = String(describing:input)
    print(output)
}