【问题标题】:How to create an extension of the Swift struct JoinedSequence?如何创建 Swift 结构 JoinedSequence 的扩展?
【发布时间】:2017-02-10 10:47:38
【问题描述】:

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

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

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

很遗憾不起作用,因为“对成员 'joined()' 的模糊引用”。

joinWithComma 应与 CustomStringConvertible 序列一起使用,并应返回 String

【问题讨论】:

    标签: swift generics swift3


    【解决方案1】:

    这可能是你想要的:

    extension Sequence where Iterator.Element == String {
      public func joinWithComma() -> String {
        return joined(separator: ", ")
      }
    }
    
    var arr = ["1", "2"]
    
    arr.joinWithComma() // output: "1, 2"
    

    查看Array documentationjoined(separator: String = default) -> String 方法,这样说:

    如果您尝试为此目的使用 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'
    

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

    【讨论】:

    • 您能否解释一下为什么扩展程序在Sequence 而不是JoinedSequence
    • @IgnazioC 它确实需要你想要的,但它是比 JoinedSequence 更通用的类型。那为什么不呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    相关资源
    最近更新 更多