2017-02-10 19 views
0

私は関数joined(separator:)の周りにラッパーを作成する必要があり、私は最良の方法は、元の関数が宣言されているJoinedSequence strucの拡張を作成することだと思う。Swift構造体の拡張を作成する方法JoinedSequence?

だから私は、このサンプルコードを書いた: "メンバーへあいまいな参照がを '()参加しました'" ため

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

は、残念ながら動作しません。

joinWithCommaCustomStringConvertibleのシーケンスで動作するはずですし、返す必要がありString

答えて

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' 

注:これはおそらく、より経験豊富な誰かがこの問題についての正確な説明を伝えることができ、これについては私自身の観察です。

+0

なぜ拡張子が 'JoinedSequence'ではなく' Sequence'であるのか説明できますか? – IgnazioC

+0

@IgnazioC JoinedSequenceよりも一般的なタイプのほうがいいでしょう。だからなぜ? – JeremyP