在Swift中将数组转换为字符串,使用stringInterpolationSegment。

4
我将尝试在Swift中将一个枚举数组转换为字符串。我的枚举类型是Printable,并有一个description属性。
我认为下面的代码会起作用:
", ".join(a.map { String($0) }) 

但是编译器报错。
Missing argument label 'stringInterpolationSegment:' in call

因此,我遵循建议,

", ".join(a.map { String(stringInterpolationSegment: $0) })

但我不明白:

  1. 为什么需要参数标签?
  2. stringInterpolationSegment的类型是什么?
2个回答

3
您不能使用枚举类型调用String初始化程序,因为没有接受该类型的初始化程序。
有许多初始化程序适用于String,其中包含stringInterpolationSegment参数,并且它们各自为不同的类型实现它。这些类型包括Bool、Float、Int和Character等。当其他方法均失败时,会使用通用后备方案。
/// Create an instance containing `expr`\ 's `print` representation
init<T>(stringInterpolationSegment expr: T)

这是调用枚举时使用的版本,因为它不属于支持的类型之一。

请注意,您还可以采用更简洁的方式:

", ".join(a.map { toString($0) })

你可以跳过闭包表达式(感谢 @Airspeed Velocity 指出):

", ".join(a.map(toString))

1
你可以跳过闭包表达式:", ".join(a.map(toString)) - Airspeed Velocity

1
正如 @vacawama 指出的那样,错误信息有点误导人,你可以使用 maptoString 来转换它。
但是好的地方是,如果你已经实现了 Printable,那么数组的 Printable 实现也将使用它,因此你只需执行 toString(a) 就可以获得类似的输出。

OP说他的枚举是可打印的(Printable),并且有一个描述属性。 - vacawama
哎呀,我错过了,我的错! - Airspeed Velocity
如果您不介意括号[],那么这个方法非常有效。 - vacawama
(开玩笑)dropLast(dropFirst(toString(a))) - Airspeed Velocity

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接