2017-01-08 1 views
2

スウィフトコードの適切な量を書いたにもかかわらず、スウィフトコードがどのように動作するのか説明することなく、クールスウィフト技術のこの例にぶつかりました。複雑なSwiftismsのそれは現在、私の頭の周りにねじれている。このスウィフトハッカーを理解するのに役立つでしょう

スウィフトに十分堪能な人が、それを解剖してその目的を分別していないのであれば、それは本当に自分の言語の理解力とより強力な機能を増やし、おそらく他の人も啓発するでしょう。

extension Array { 
    var match : (head: T, tail: [T])? { 
     return (count > 0) ? (self[0], Array(self[1..<count])) : nil 
    } 
} 

func map<A, B>(f: A -> B, arr: [A]) -> [B] { 
    if let (head, tail) = arr.match { 
     return [f(head)] + map(f, tail) 
    } else { 
     return [] 
    } 
} 
+0

ふみます。前にSwiftを使ったことはありませんが、私はそれを読むことができると思います。どの部分が問題を与えていますか? – melpomene

+0

質問がいくつかあります。 で「宣言されている」ため、AとBがどのように型であり、それらが型でどのように使用されているかを理解しています。しかし、誰かがArrayのソースコードを見て、何かを知っていない限り、明示的に宣言されずに、TがArrayエクステンションのmatch関数で計算されたプロパティの型としてどのように使われるか分かりません。 – clearlight

+1

'Array'は*ジェネリック*型で、Swift2では' T'の型ホルダでした。これはSwift3で 'Element'と呼ばれています。 –

答えて

2

extensionからArrayタイプmatchと呼ばれる新しい計算プロパティを定義します。この特性は、型(head: T, tail: [T])?、(head名前)最初の要素タイプTとはTの型配列である(tailと命名)は、第2の要素であるので、任意のタプルです。 Tは、配列の内部に格納されている要素の型の汎用型にすぎません(Arrayは汎用コレクション自体です)。

var match : (head: T, tail: [T])? { 
    return (count > 0) ? (self[0], Array(self[1..<count])) : nil 
} 

アレイは、任意の要素が含まれていない場合、この計算されたプロパティは、nilを返すか、それが最初のリストの要素(self[0]とリストの末尾(最初を除くすべてのものを含むタプルを返します要素):。Array(self[1..<count])

今その配列は、この計算された性質を持っている私たちは、再帰的配列の要素に機能fを呼び出し、それらの関数呼び出しの結果が含まれてArray新しいを返すために、それを利用することができます。これはあります。何がmap機能しますか:

func map<A, B>(f: A -> B, arr: [A]) -> [B] { 
    if let (head, tail) = arr.match { 
     return [f(head)] + map(f, tail) 
    } else { 
     return [] 
    } 
} 

マッピング関数fしたがってmapタイプ[A]の配列を通過する必要があり、それはタイプBの要素にタイプAの要素をマッピングすることを意味するtypeA -> Bです。 match変数とオプションのバインディングを使用して、リスト[f(head)]の先頭にあるfを呼び出し、それを新しいリストの中に入れて、残りの配列要素map(f, tail)に対して再帰的なmap呼び出しの結果を追加します。

、彼らがより良い実装しようとしているマップの機能を理解するには、次の

enter image description here

+0

'f:A - > B'とは何か分かりません。私は ' - >'は関数の戻り値のためだと考えました。 Swiftのドキュメントを読んでからしばらくありました。私はこれを掘り起こすつもりです。 Aが関数型でなければ、私は本当に混乱しています。単純なタイプの場合は意味がありません。 'A - > B'のように、浮動小数点数を返すintです。 – clearlight

+2

@clearlight 'A - > Bは' A 'を取り出して 'B'を返す関数の型です。つまり' f'は 'A'から' B'までの関数です。 – melpomene

+1

@clearlight私も答えに加えました。そのリンクをたどると、これについてもっと読むことができます( 'type'で)。 – Keiwan

関連する問題