如何创建Swift结构JoinedSequence的扩展?

时间:2017-02-10 10:47:38

标签: swift generics swift3

我需要在函数joined(separator:)周围创建一个包装器,我认为最好的方法是创建声明原始函数的JoinedSequence struc的扩展名。

所以我写了这个示例代码:

extension JoinedSequence {
    func joinWithComma() -> String {
        return joined(separator: ", ")
    }
}
不幸的是,

无效,因为“对成员的歧义引用'加入了()'”。

joinWithComma应该使用CustomStringConvertible序列,并且应该返回String

1 个答案:

答案 0 :(得分:2)

这可能是你想要的:

extension Sequence where Iterator.Element == String {
  public func joinWithComma() -> String {
    return joined(separator: ", ")
  }
}

var arr = ["1", "2"]

arr.joinWithComma() // output: "1, 2"

查看其joined(separator: String = default) -> String 方法Array documentation,说明了这一点:

enter image description here

如果您尝试将JoinedSequence用于此目的,则新方法扩展将无法访问数组。

extension JoinedSequence where Base.Iterator.Element.Iterator.Element == String {
  public func joinWithComma() -> String {
    return joined(separator: ", ")
  }
}

var arr = ["1", "2"]

arr.joinWithComma() 
// Compiler error: Value of type '[String]' has no member 'joinWithComma'

注意:这是我自己对此的观察,可能更有经验的人可以准确地说明这个问题的解释。