为什么不能使用Swift的字符串构造函数将泛型转换为字符串?

时间:2018-09-23 01:13:01

标签: swift generics

请考虑以下示例。

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)
}

为什么第一种方法不起作用,而第二种方法却不起作用?获取泛型字符串表示形式的“正确”方法是什么?

1 个答案:

答案 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:)略有不同。