2017-02-19 10 views
0

私はこのプロトコルとそれを実装する構造体を取得します。この例では、「Iterator.Element:Textrepresentableの拡張コレクション」とは何ですか?

protocol TextRepresentable { 
    var textualDescription: String { get } 
} 


struct Hamster: Textrepresentable { 
    var name: String 
    var textualDescription: String { 
     return "A hamster named \(name)" 
    } 
} 

このコードはどのように機能していますか?

extension Collection where Iterator.Element: TextRepresentable { 
    var textualDescription: String { 
     let itemsAsText = self.map { $0.textualDescription } 
     return "[" + itemsAsText.joined(separator: ", ") + "]" 
    } 
} 

このコードにはどのような拡張機能がありますか?

let murrayTheHamster = Hamster(name: "Murray") 
let morganTheHamster = Hamster(name: "Morgan") 
let mauriceTheHamster = Hamster(name: "Maurice") 
let hamsters = [murrayTheHamster, morganTheHamster, mauriceTheHamster] 

print(hamsters.textualDescription) 
+1

ところで、Swift Standard Libraryには、この機能をモデル化するプロトコル( 'CustomStringConvertible'と' CustomDebugStringConvertible')が既にあります。 – Alexander

+0

@Alexander私は親愛なることについて何の考えも持っていません。迅速に、以下の答えが私の混乱を終了しました。 :) –

答えて

1

このコード

extension Collection where Iterator.Element: TextRepresentable { 
    var textualDescription: String { 
     let itemsAsText = self.map { $0.textualDescription } 
     return "[" + itemsAsText.joined(separator: ", ") + "]" 
    } 
} 

Collectionの要素はTextRepresentable(すなわちプロトコルTextRepresentableに準拠)である場合にのみ有効であるCollection上の拡張を作成します。 CollectionArrayCollectionの場合)の場合、この拡張子は計算されたプロパティtextualDescriptionCollectionに追加します。

サンプルコードhamstersにはTextRepresentableに適合するタイプHamsterのオブジェクトのみが含まれています。したがって、コンパイラは、拡張子がArrayhamstersに有効であり、プロパティがtextualDescriptionであることを認識しています。

textualDescriptionの実装もかなり簡単です。

// Defines a property named textualDescription of type String 
var textualDescription: String { 

    // Calls textualDescription on every element of the array 
    // and adds the return values to a new array itemsAsText 
    let itemsAsText = self.map { $0.textualDescription } 

    // Creates a string starting with "[" followed by 
    // all the elements in itemsAsText, separated by ",", 
    // and a "]". Then, returns that String 
    return "[" + itemsAsText.joined(separator: ", ") + "]" 
} 
+0

あなたの答えは本当にありがとうございます。私はそれを取得し、本当にあなたの時間を感謝します。私は迅速に学習しており、さらに質問することができます。私に答えるためにそこにいてください:)ありがとうございました。 –

0

1個ずつ取りに行きましょう。このコード:

extension Collection where Iterator.Element: TextRepresentable { 
    //... 
} 

Iterator.ElementTextRepresentableあるCollectionに準拠タイプの拡張を定義します。ドキュメントを見ると、ArrayMutableCollectionに準拠しており、Collectionから継承しています。したがって、Arrayは間接的にCollectionに従います。 hamstersの配列はArray(したがってCollection)です(要素はHamster)。 HamsterTextRepresentableなので、hamsters配列はこの拡張子を受け取る資格があります。

さて、この拡張機能は、私たちを与えるものを見てみましょう:

var textualDescription: String { 
    // ... 
} 

これはStringを返しtextualDescriptionと呼ばれる計算されたプロパティ、です。この計算されたプロパティは、この拡張に適格なすべてのタイプで使用可能になります。それがどのように動作するかを深く踏み込ん:

let itemsAsText = self.map { $0.textualDescription } 

このコレクションの項目がmap(_:)を使用してtextualDescription秒のArrayに変換されます。あなたの例では、[Hamster(name: "Murray"), Hamster(name: "Morgan"), Hamster(name: "Maurice")]Arrayにマップされます。最終的に生産するために"Murray", "Morgan", "Maurice"

その後、 [に包まれ

]["Murray", "Morgan", "Maurice"]

return "[" + itemsAsText.joined(separator: ", ") + "]" 

を次に、これらすべてのテキスト記述は、文字列を生成するために, "によって結合されています結果の文字列:["Murray", "Morgan", "Maurice"]

フォローアップの質問がある場合はお知らせください。

関連する問題