请考虑以下示例。
func printGeneric<T>(_ input: T) {
let output = String(input)
print(output)
}
这将导致错误cannot invoke initializer for type 'String' with an argument list of type '(T)'
。 (在操场上测试过)
但是,由于某些原因,这确实可行。
func printGeneric<T>(_ input: T) {
let output = "\(input)"
print(output)
}
为什么第一种方法不起作用,而第二种方法却不起作用?获取泛型字符串表示形式的“正确”方法是什么?
答案 0 :(得分:2)
怎么样
func printGeneric<T>(_ input: T) {
let output = String(describing:input)
print(output)
}
关于原因:
第一种方法String(x)
用于特定的情况,其中x
的类型可以强制为String,以便在程序中使用。换句话说,它是一种类型,其中每个值都有一个字符串 equivalent ,例如1
和"1"
。 (请参见LosslessStringConvertible。)我们不知道T是否是这种类型,因此编译失败。
但是String(describing:x)
与"\(x)"
完全相同—它旨在将任何内容打印到控制台。它不是强制,而是字符串表示形式。
您还可以选择使用String(reflecting:)
;它与String(describing:)
略有不同。