Swift:将实际类型的数组转换为协议类型

时间:2016-08-02 05:26:03

标签: swift

假设你有一个为ToString实现的协议Int,以及一个带有ToString数组的函数。

尝试将Int数组传递给此函数会导致错误Cannot convert value of type '[Int]' to expected argument type '[ToString]'

但是,在将数组传递给函数之前在数组上使用map可以正常工作。这是所谓的进行类型转换的方法还是有一种不会导致迭代遍历数组的方法?或者这是由编译器优化的吗?

完整示例:

protocol ToString {
  func toString() -> String
}

extension Int: ToString {
  func toString() -> String {
    return "\(self)"
  }
}

func log( values: [ToString]) {
  values.forEach { print( $0.toString()) }
}

let values: [Int] = [1, 2, 3]

// Error: Cannot convert value of type '[Int]' to expected argument type '[ToString]'
log( values)

// No error
log( values.map { $0 })

1 个答案:

答案 0 :(得分:3)

This Q&A解释了这个问题。我将建议一个避免创建新数组的修复:使log函数通用,并在其类型参数上添加类型约束,要求它符合ToString协议:

func log<T:ToString>( values: [T]) {
    values.forEach { print( $0.toString()) }
}

现在,Swift允许您使用任何类型的数组调用函数,只要数组元素符合ToString协议。