Swiftでゞェネリックを䜿甚する

Swiftでのプログラミング方法を既に理解しおいる堎合は、おそらくSwift蚀語の基本ず、クラスず構造の䜜成方法をすでに知っおいるでしょう。 しかし、Swiftはそれ以䞊の機胜を備えおいたす。 この蚘事の目的は、 ゞェネリックず呌ばれる他のいく぀かの蚀語ですでに普及しおいるSwiftの非垞に匷力な偎面に぀いお話すこずです。



型に関しお安党なプログラミング蚀語を䜿甚するず、これは、1぀の型のみで動䜜するコヌドを蚘述するような䞀般的な問題ですが、別の型では非垞に正確です。 たずえば、関数が2぀の敎数を远加するずしたす。 2぀の浮動小数点数を远加する関数は非垞によく䌌おいたすが、実際には同じように芋えたす。



唯䞀の違いは、倉数の倀タむプです。



匷く型付けされた蚀語では、個々の関数をaddInts、addFloats、addDoublesなどずしお定矩する必芁がありたす。各関数には正しい匕数があり、型を返したす。



倚くのプログラミング蚀語は、この問題の解決策を実装しおいたす。 たずえば、C ++はテンプレヌトを䜿甚したす。 Swift、JavaずCの䞡方がゞェネリックを䜿甚しおいる-したがっお、このチュヌトリアルのトピックです



䞀般化されたSwiftプログラミングに関するこの蚘事では、既に芋たものを含め、プログラミング蚀語の既存のゞェネリックの䞖界に飛び蟌みたす。 次に、ナヌザヌの怜玢条件を远跡するカスタムナニバヌサルデヌタ構造を䜿甚しお、Flickrで写真怜玢プログラムを䜜成したす。



泚 このSwift関数型プログラミングの蚘事は、Swiftの基本をすでに知っおいる人向けです。 Swiftの基本に慣れおいない堎合は、最初に他のSwiftチュヌトリアルをチェックするこずをお勧めしたす。



ゞェネリック医薬品の玹介



あなたはこれを知らないかもしれたせんが、おそらくゞェネリックがSwiftで動䜜しおいるのを芋たこずがあるでしょう。 配列ず蟞曞は、ビゞネスにおける䞀般的なセキュリティの兞型的な䟋です。



Objective-C開発者は、同じコレクション内の異なるタむプのオブゞェクトを含む配列ず蟞曞に慣れおいたす。 これにより柔軟性が向䞊したすが、APIから返される配列がストレヌゞ甚であるこずをご存知ですか 別の圢匏のドキュメントであるドキュメントたたは倉数名を芋るず確認できたす。 ドキュメントの堎合でも、実行時にコレクションの゚ラヌを防ぐ方法はありたせん゚ラヌのないコヌド以倖にはありたせん。



䞀方、Swiftには配列ず蟞曞がありたす。 Ints配列にはIntsのみを含めるこずができ、たずえばStringを含めるこずはできたせん。 これは、コヌドを蚘述するこずでコヌドを登録できるこずを意味したす。これにより、コンパむラは型チェックを実行できたす。



たずえば、Objective-C UIKitでは、ナヌザヌビュヌに基づいおタッチを凊理するメ゜ッドは次のようになりたす。



- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
      
      







ご存知のように、このメ゜ッドのセットにはUITouchむンスタンスのみが含たれおいたすが、それはドキュメントに蚘茉されおいるためです。 しかし、オブゞェクトが他の䜕かになるこずを劚げるものは䜕もありたせん。通垞、セット内のタッチをUITouchむンスタンスずしお把握しお、それらをUITouchオブゞェクトずしお効果的に扱う必芁がありたす。



珟時点では、Swiftには暙準ラむブラリで定矩されおいるセットがありたせん。 ただし、セットではなく配列を䜿甚した堎合は、䞊蚘のメ゜ッドを次のように蚘述できたす。



 func touchesBegan(touches: [UITouch]!, withEvent event: UIEvent!)
      
      







これは、touchs配列にUITouchむンスタンスのみが含たれおいるこずを瀺し、このメ゜ッドを䜿甚するコヌドが他のものを枡そうずするず、コンパむラヌぱラヌをスロヌしたす。 型がコンパむラによっお蚭定/定矩されるだけでなく、UITouchむンスタンスの芁玠を蚈算する必芁がなくなりたす



䞀般に、ゞェネリックはクラスのパラメヌタヌずしお型を提䟛したす。 すべおの配列は同じように機胜し、倀をリストに保存したすが、䞀般的な配列は倀のタむプをパラメヌタヌ化したす。 配列で䜿甚するアルゎリズムは非固有ではないため、すべおのタむプの倀を持぀すべおの配列でそれらを分離できたす。



ゞェネリックずその利点に関する基本的な情報が埗られたので、それらを特定のシナリオに安党に適甚できたす。



ゞェネリックの仕組み



ゞェネリックをテストするには、Flickrで画像を怜玢するアプリケヌションを䜜成する必芁がありたす。



このチュヌトリアルのスタヌタヌプロゞェクトをダりンロヌドするこずから始めたす 。 開いお、すぐにメむンクラスに慣れたす。 FlickrクラスはFlickr APIを凊理できたす。 このクラスにあるAPIのキヌはすぐに提䟛されたすが、アプリケヌションを拡匵する堎合は独自のキヌを䜿甚できたす。 こちらで賌読できたす 。



アプリケヌションをコンパむルしお実行するず、次のように衚瀺されたす。



画像



ただただです 怖がらないでください、猫ず䞀緒に写真がすぐに衚瀺されたす。



順序付き蟞曞



アプリケヌションはナヌザヌリク゚ストごずに画像をアップロヌドし、最新の怜玢が画面の䞊郚にリストずしお衚瀺されたす。



しかし、ナヌザヌが同じアむテムを2回怜玢するずどうなりたすか アプリケヌションが叀い結果を新しいリストの䞀番䞊に移動し、新しい結果に眮き換えればいいず思いたす。



デヌタ構造に配列を䜿甚しお結果を返すこずができたすが、ゞェネリックを調べるには、新しいコレクション、぀たり順序​​付けられた蟞曞を䜜成する必芁がありたす。



倚くのプログラミング蚀語ずフレヌムワヌクSwiftを含むでは、配列ずは異なり、セットず蟞曞は順序を保蚌したせん。 順序付けられた蟞曞は通垞の蟞曞のように芋えたすが、特定の順序でキヌが含たれおいたす。 この機胜を䜿甚しお怜玢結果を保存したす。これにより、結果をすばやく怜玢したり、衚の順序を維持したりできたす。



慎重でない堎合は、ナヌザヌデヌタ構造を䜜成しお、順序付けられた蟞曞を凊理できたす。 しかし、あなたは先芋の明がありたす 今埌数幎間、アプリケヌションで䜿甚できるものを䜜成したいず考えおいたす。 ゞェネリックは理想的なオプションです。



䞀次デヌタ構造



[ファむル]、[新芏]、[ファむル]、[iOS]、[゜ヌス]、[スりィフトファむル]の順に遞択しお、新しいファむルを远加したす。 [次ぞ]をクリックし、ファむルにOrderedDictionaryずいう名前を付けたす。 最埌に、䜜成をクリックしたす。



その結果、空のSwiftファむルが䜜成され、次のコヌドを远加する必芁がありたす。



 struct OrderedDictionary { }
      
      







これたでのずころ、これは驚くこずではありたせん。 オブゞェクトは倀のセマンティクスを持たなければならないため、構造䜓になりたす。



泚  芁するに、意味のセマンティクスは、「パブリックリンク」ではなく「コピヌ/貌り付け」ず蚀う珍しい方法です。 倀のセマンティクスには倚くの利点がありたす。たずえば、予期せずデヌタを倉曎する可胜性のあるコヌドの別の郚分を心配する必芁はありたせん。 詳现に぀いおは、第3章のレッスン「 クラスず構造」で Swiftを理解する方法を参照しおください。



ここで、ゞェネリックにする必芁があるため、必芁なタむプの倀を含めるこずができたす。 構造定矩を次のように倉曎したす。



 struct OrderedDictionary<KeyType, ValueType>
      
      







山カッコ内の芁玠は、ゞェネリック型パラメヌタヌです。 KeyTypeずValueTypeはそれ自䜓は型ではなく、構造定矩内の型の代わりに䜿甚できるパラメヌタヌになりたす。 理解できなければ、近い将来にすべおが明らかになるでしょう。



順序付き蟞曞を実装する最も簡単な方法は、配列ず蟞曞の䞡方を維持するこずです。 蟞曞には、デヌタ倉換ず配列キヌが栌玍されたす。



構造定矩に次のコヌドを远加したす。



 typealias ArrayType = [KeyType] typealias DictionaryType = [KeyType: ValueType] var array = ArrayType() var dictionary = DictionaryType()
      
      







これは、説明した2぀のプロパティず、既存のタむプに新しい名前を付ける2぀のタむプ゚むリアスを瀺したす。 ここでは、バックアップアレむずディクショナリのそれぞれに、アレむの゚むリアスずディクショナリのタむプを指定したす。 タむプ゚むリアスは、耇雑なタむプを取埗し、はるかに短い名前を付けるのに最適な方法です。



型の代わりに、構造定矩のKeyTypeおよびValueType型パラメヌタヌを䜿甚できるこずに泚意しおください。 配列はKeyTypesの配列です。 もちろん、KeyTypeなどのタむプはありたせん。 代わりに、Swiftは、ゞェネリック型のむンスタンス化䞭に、あらゆるタむプの順序付き蟞曞ナヌザヌのようにそれを扱いたす。



この時点で、コンパむラ゚ラヌに気付くでしょう。



タむプ「Keytype」はプロトコル「Hashable」に準拠しおいたせん



これはあなたにずっお驚きかもしれたせん。 蟞曞の実装を芋おください。



 struct Dictionary<KeyType: Hashable, ValueType>
      
      







これは、KeyTypeの埌の「Hashable」を陀いお、OrderedDictionaryの定矩に非垞に䌌おいたす。 セミコロンの埌のHashableは、KeyTypeに枡される型がHashableプロトコルに準拠する必芁があるこずを瀺したす。 これは、ディクショナリがその実装のためにキヌをハッシュできる必芁があるためです。



この方法でゞェネリック型パラメヌタヌを制限するこずは非垞に䞀般的になりたした。 たずえば、アプリケヌションがこれらの倀をどう凊理する必芁があるかに応じお、EquatableたたはPrintableプロトコルに適合するように倀のタむプを制限するこずができたす。



OrderedDictionary.swiftを開き、構造定矩を次のものに眮き換えたす。



 struct OrderedDictionary<KeyType: Hashable, ValueType>
      
      







これは、OrderedDictionaryのKeyTypeがHashableず䞀臎する必芁があるこずを瀺しおいたす。 これは、KeyTypeがどのタむプになっおも、メむン蟞曞のキヌずしお受け入れられるこずを意味したす。



これで、ファむルぱラヌなしでコンパむルされたす



キヌ、意味、ゞャズ



倀を远加できない堎合の蟞曞の䜿甚は䜕ですか OrderedDictionary.swiftを開き、次の関数を構造定矩に远加したす。



 // 1 mutating func insert(value: ValueType, forKey key: KeyType, atIndex index: Int) -> ValueType? { var adjustedIndex = index // 2 let existingValue = self.dictionary[key] if existingValue != nil { // 3 let existingIndex = find(self.array, key)! // 4 if existingIndex < index { adjustedIndex-- } self.array.removeAtIndex(existingIndex) } // 5 self.array.insert(key, atIndex:adjustedIndex) self.dictionary[key] = value // 6 return existingValue }
      
      







これらはすべお、新しい情報に慣れ芪しんでくれるでしょう。 それらを段階的に芋おみたしょう



  1. 新しいオブゞェクトの挿入に圹立぀メ゜ッドinsert_forKeyatIndexには、3぀のパラメヌタヌが必芁です。特定のキヌの倀ずむンデックス。キヌず倀のペアを挿入できたす。 ここには、これたで芋たこずがないかもしれないキヌワヌドがありたす倉化したす。
  2. そのキヌに既存の倀が既に存圚する堎合は、既存の倀を返す蟞曞むンデクサヌにキヌを向けたす。 この挿入メ゜ッドは、ディクショナリのupdateValueず同じ動䜜を暡倣するため、キヌの既存の倀を保持したす。
  3. 既存の倀がある堎合、メ゜ッドを䜿甚する堎合にのみ、そのキヌの配列内のむンデックスが怜玢されたす。
  4. 既存のキヌが挿入むンデックスの前にある堎合、既存のキヌを削陀する必芁があるため、挿入むンデックスを蚭定する必芁がありたす。
  5. 必芁に応じお、配列ず蟞曞を曎新する必芁がありたす。
  6. 最埌に、既存の倀を返したす。 関数が远加の倀を返すため、既存の倀が存圚しない可胜性があるため。




蟞曞に倀を远加できるようになったので、倀を削陀するのはどうですか



OrderedDictionaryの構造定矩に次の関数を远加したす。



 // 1 mutating func removeAtIndex(index: Int) -> (KeyType, ValueType) { // 2 precondition(index < self.array.count, "Index out-of-bounds") // 3 let key = self.array.removeAtIndex(index) // 4 let value = self.dictionary.removeValueForKey(key)! // 5 return (key, value) }
      
      







コヌドをステップごずにもう䞀床芋おみたしょう。



  1. これは、構造の内郚状態を倉曎する関数であり、したがっお、そのように認識したす。 removeAtIndexずいう名前は、Arrayのメ゜ッドに察応しおいたす。 必芁に応じお、システムラむブラリのAPIのミラヌリングを怜蚎するこずをお勧めしたす。 これにより、APIを䜿甚しおいる開発者がプラットフォヌム䞊で気軜に操䜜できたす。
  2. たず、むンデックスをチェックしお、配列内にあるかどうかを確認できたす。 基本配列から蚱容範囲倖のアむテムを削陀しようずするず、ランタむム゚ラヌがスロヌされるため、チェックはこれを少し前に怜出したす。 Claim-CでObjective-Cのステヌトメントを䜿甚した可胜性がありたす。 assertはSwiftでも利甚可胜ですが、前提条件が機胜しなくなった堎合にアプリケヌションを終了できるように、珟圚、最終ビルドで前提条件が䜿甚されおいたす。
  3. 次に、配列から倀を削陀しながら、指定されたむンデックスの配列からキヌを取埗したす。
  4. 次に、そのキヌの倀を蟞曞から削陀したす。これにより、以前に存圚しおいた倀も返されたす。 蟞曞にはこのキヌの倀が含たれおいない可胜性があるため、removeValueForKeyは远加のマテリアルを返したす。 この堎合、ディクショナリに远加できるメ゜ッドは独自に䜜成した挿入__forKeyatIndex :)のみであるため、ディクショナリにはこのキヌの倀が含たれるこずがわかっおいたす。 したがっお、䟡倀があるこずを知りながら、远加の資料をすぐに公開できたす。
  5. 最埌に、キヌず倀をタプルに返したす。 これは、既存の倀を返すremoveAtIndex配列ずremoveValueForKey蟞曞の動䜜ず䞀臎しおいたす。




倀ぞのアクセス



これでディクショナリに曞き蟌むこずができたすが、ディクショナリから読み取るこずはできたせん-これはデヌタ構造には圹に立ちたせん ここで、蟞曞から倀を取埗できるメ゜ッドを远加する必芁がありたす。



OrderedDictionary.swiftを開き、次のコヌドを定矩構造に远加し、配列ず倉数の宣蚀の䞋で蟞曞をポむントしたす。



 var count: Int { return self.array.count }
      
      







これは、通垞そのようなデヌタ構造に必芁なデヌタである、順序付けられた語圙の数の蚈算されたプロパティです。 配列内の番号は垞に順序付けられた蟞曞の番号ず䞀臎するため、すべおが単玔になりたす



次に、蟞曞の芁玠にアクセスする必芁がありたす。 Swiftでは、次のようにむンデックス構文を䜿甚しお蟞曞にアクセスしたす。



 let dictionary = [1: "one", 2: "two"] let one = dictionary[1] // Subscript
      
      







これで構文に粟通したしたが、おそらく配列ず蟞曞に䜿甚されおいるこずを芋ただけでしょう。 独自のクラスず構造をどのように䜿甚したすか 幞い、Swiftを䜿甚するず、カスタムクラスにむンデックス動䜜を簡単に远加できたす。



構造定矩の䞋郚に次のコヌドを远加したす。



 // 1 subscript(key: KeyType) -> ValueType? { // 2(a) get { // 3 return self.dictionary[key] } // 2(b) set { // 4 if let index = find(self.array, key) { } else { self.array.append(key) } // 5 self.dictionary[key] = newValue }
      
      







このコヌドの機胜は次のずおりです。







これで、通垞の蟞曞であるかのように、順序付けされた蟞曞にむンデックスを付けるこずができたす。 特定のキヌの倀を取埗できたすが、配列のようにむンデックスでアクセスするのはどうですか 順序付けられたディクショナリでどのように機胜するかを芋お、むンデックスを介しお芁玠にアクセスするのもいいでしょう。



クラスず構造䜓は、さたざたなタむプの匕数に察しお耇数のむンデックス定矩を持぀こずができたす。 構造定矩の䞋郚に次の関数を远加したす。



 subscript(index: Int) -> (KeyType, ValueType) { // 1 get { // 2 precondition(index < self.array.count, "Index out-of-bounds") // 3 let key = self.array[index] // 4 let value = self.dictionary[key]! // 5 return (key, value) } }
      
      







これは、パラメヌタタむプがIntになっおいるこずを陀いお、以前に远加した添え字に䌌おいたす。これは、これが配列のむンデックスを参照するために䜿甚するものだからです。 ただし、今回は、指定されたむンデックスを栌玍するのはOrderedDictionaryであるため、結果の型はキヌず倀のタプルです。



このコヌドの仕組み



  1. この添え字にはゲッタヌメ゜ッドのみがありたす。 順序付けされた蟞曞のサむズ範囲にあるむンデックスを最初にチェックするこずで、同様にセッタヌメ゜ッドを実装できたす。
  2. むンデックスは配列内に存圚する必芁がありたす。これにより、順序付けされた蟞曞の長さが決たりたす。 前提条件を䜿甚しお、順序付けされた蟞曞の倖郚にアクセスしようずするプログラマヌに譊告したす。
  3. キヌは、配列から取埗するこずで芋぀けるこずができたす。
  4. 倀は、特定のキヌの蟞曞から取埗するこずで芋぀けるこずができたす。 繰り返したすが、拡匵された远加マテリアルの䜿甚に泚意しおください。知っおいるように、蟞曞には配列内のキヌの倀が含たれおいる必芁がありたす。
  5. 最埌に、キヌず倀を含むタプルを返したす。




タスクこのむンデックスのセッタヌを実装したす。 前のむンデックス定矩のように、セットを远加しおから完了したす。



この時点で、KeyTypeがIntの堎合はどうなるのか疑問に思うかもしれたせん。 ゞェネリックスの利点は、Intを含むキヌずしおの任意のハッシュタむプの入力です。 この堎合、むンデックスはどのむンデックスコヌドを䜿甚するかをどのように知るのですか



これは、コンパむラが䜕をすべきかを知るために、より倚くの型情報をコンパむラに提䟛する必芁がある堎所です。 各むンデックスには異なる戻り倀の型があるこずに泚意しおください。 したがっお、キヌ倀のタプルを蚭定しようずしおいる堎合、コンパむラは配列のような添え字を䜿甚する必芁があるこずを認識したす。



システムテスト



プログラムを実行しお、コンパむル方法、䜿甚するむンデックスメ゜ッド、およびOrde​​redDictionaryが党䜓ずしおどのように機胜するかを実隓できるようにしたす。



File \ New \ File ...をクリックし、iOS \ Source \ Playgroundを遞択しお、Nextをクリックしお、新しいPlaygroundを䜜成したす。 ODPlaygroundずいう名前を付けお、[䜜成]をクリックしたす。



OrderedDictionary.swiftをコピヌしお、新しいプレむグラりンドに貌り付けたす。 残念ながら、このレッスンを曞いおいる時点では、サむトはアプリケヌションモゞュヌルのコヌドを「芋る」こずができないため、これを行う必芁がありたす。



泚 ここで実装されおいるコピヌ/貌り付けメ゜ッドを陀き、これには回避策がありたす。 アプリケヌションコヌドをフレヌムワヌクに移動した堎合、Korin Krichが指摘しおいるように、Playgroundはコヌドにアクセスできたす。



次のコヌドをプレむグラりンドに远加したす。



 var dict = OrderedDictionary<Int, String>() dict.insert("dog", forKey: 1, atIndex: 0) dict.insert("cat", forKey: 2, atIndex: 1) println(dict.array.description + " : " + dict.dictionary.description) var byIndex: (Int, String) = dict[0] println(byIndex) var byKey: String? = dict[2] println(byKey)
      
      







サむドバヌたたは衚瀺\アシスタント゚ディタヌ\アシスタント゚ディタヌの衚瀺で、出力倉数printlnを確認できたす。



画像



この䟋では、ディクショナリにはIntキヌがありたす。これは、コンパむラが䜿甚するむンデックスを決定する倉数のタむプを考慮するためです。 byIndexはInt、Stringタプルであるため、コンパむラは、予想される戻り倀の型に䞀臎する添字配列スタむルのむンデックスバヌゞョンを䜿甚する必芁があるこずを認識しおいたす。



単䞀のbyIndexたたはbyKey倉数からデヌタ型定矩を削陀しおください。 コンパむラ゚ラヌが衚瀺されたす。これは、コンパむラが䜿甚する添え字を認識しおいないこずを瀺したす。



ヒント 型掚論を実行するには、コンパむラは匏の型が䞀意である必芁がありたす。 匕数のタむプが同じで戻り倀のタむプが異なる耇数のメ゜ッドが存圚する堎合、呌び出し偎の関数は固有でなければなりたせん。 Swiftにメ゜ッドを远加するず、アセンブリに重倧な倉曎が加えられる可胜性があるため、泚意しおください



プレむグラりンドで順序付けられた蟞曞を詊しお、これがどのように機胜するかを理解しおください。 アプリケヌションに戻る前に、远加しおから削陀し、キヌずタむプの倀を倉曎しおみおください。



これで、泚文した蟞曞の読み曞きができたす これは、デヌタ構造の管理に圹立ちたす。 これで、アプリケヌションの䜿甚を開始できたす



画像怜玢の远加



それでは、アプリケヌションに戻りたしょう。



MasterViewController.swiftを開き、2぀の@IBOutletsのすぐ䞋に次の倉数定矩を远加したす。



 var searches = OrderedDictionary<String, [Flickr.Photo]>()
      
      







これは、ナヌザヌがFlickrから受け取った怜玢結果を含む順序付けられた蟞曞でなければなりたせん。 ご芧のずおり、文字列、怜玢条件、Flickr.Photo配列、たたはFlickr APIから返された写真が衚瀺されたす。通垞の蟞曞の堎合ず同じ方法で、キヌず倀を山括匧に向けるこずに泚意しおください。これらは、この実装ではKeyTypeおよびValueType型のパラメヌタヌになりたす。



Flickr.Photoタむプにピリオドがあるのはなぜかず思うかもしれたせん。これは、写真がFlickrクラス内で定矩されるクラスであるためです。この階局はSwiftの非垞に䟿利な機胜であり、クラス名を短く保ちながら名前空間を維持するのに圹立ちたす。 Flickrクラスの内郚では、photoクラスに属するPhotoのみを䜿甚できたす。これは、コンテキストがコンパむラヌにその内容を䌝えるためです。



次に、tableView_numberOfRowsInSection :)ずいうテヌブルビュヌデヌタ゜ヌスメ゜ッドを芋぀けお、次のコヌドに倉曎したす。



 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.searches.count }
      
      







このメ゜ッドは、テヌブルのセル数を瀺す順序付き蟞曞を䜿甚するようになりたした。



次に、テヌブルビュヌデヌタ゜ヌスメ゜ッドtableView_cellForRowAtIndexPath :)を芋぀けお、次のように倉曎したす。



 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { // 1 let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell // 2 let (term, photos) = self.searches[indexPath.row] // 3 if let textLabel = cell.textLabel { textLabel.text = "\(term) (\(photos.count))" } return cell }
      
      







このメ゜ッドで行うこずは次のずおりです。



  1. たず、dequeueReusableCellWithIdentifierがUITableViewCellではなくAnyObjectObjective-Cの識別子に戻るため、UITableViewからキュヌからセルを遞択し、UITableViewCellに盎接送信したす。おそらく将来、AppleはAPIを曞き盎しお、ゞェネリックも利甚できるようにしたす
  2. 次に、䜜成したむンデックスの添え字を䜿甚しお、指定した行のキヌず倀を取埗したす。
  3. 最埌に、テキストをセルのファセットにむンストヌルし、セルを返したす。




では、「詰め物」に぀いお話したしょう。UISearchBarDelegate拡匵機胜を芋぀けお、次のように単䞀のメ゜ッドを倉曎したす。



 func searchBarSearchButtonClicked(searchBar: UISearchBar!) { // 1 searchBar.resignFirstResponder() // 2 let searchTerm = searchBar.text Flickr.search(searchTerm) { switch ($0) { case .Error: // 3 break case .Results(let results): // 4 self.searches.insert(results, forKey: searchTerm, atIndex: 0) // 5 self.tableView.reloadData() } } }
      
      







このメ゜ッドは、ナヌザヌが[怜玢]ボタンをクリックするず呌び出されたす。このメ゜ッドで行われるこずは次のずおりです。



  1. 次に、怜玢条件を怜玢バヌのテキストずしお今すぐ参照し、Flickrクラスを䜿甚しおこのク゚リを怜玢したす。Flickrの怜玢方法は、怜玢ク゚リずクロヌゞャヌの䞡方を䜿甚しお、怜玢の成功たたは倱敗を実行したす。クロヌズは1぀のパラメヌタヌのみに頌りたす。゚ラヌたたは結果のリストです。
  2. ゚ラヌの堎合、その兆候は衚瀺されたせん。しかし、あなたはそれを行うこずができるので、あなたが望むなら譊告が衚瀺されたすが、なぜ物事を耇雑にするのでしょう。゚ラヌが害を及がさないこずをSwiftコンパむラヌに通知するには、コヌドを停止する必芁がありたす。
  3. , SearchResults. , . , .
  4. , , .




うんうんこれで、アプリケヌションが画像を怜玢したす



アプリケヌションをコンパむルしお実行し、いく぀かの怜玢を行いたす。次のようなものが衚瀺さ



画像



れたす。リストの䞀番䞊にない怜玢のいずれかを繰り返したす。そしお、あなたは圌がどのようにリストの䞀番䞊に戻るかを芋るでしょう



画像



怜玢の䞀぀をクリックしお、圌が写真を芋せないこずに気づきたす。それを修正する時が来たした



写真をください



MasterViewController.swiftを開き、prepareForSegueメ゜ッドを芋぀けたす。それを次のものに眮き換えたす。



 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "showDetail" { if let indexPath = self.tableView.indexPathForSelectedRow() { let (_, photos) = self.searches[indexPath.row] (segue.destinationViewController as DetailViewController).photos = photos } } }
      
      







この堎合、セルを䜜成するずきず同じ怜玢方法が順序付けられた蟞曞に䜿甚されたす。キヌキヌワヌドによる怜玢は䜿甚したせんが、この方法で自分で指定するこずにより、タプルのこの郚分はロヌカル倉数に関連付けられないこずを匷調したす。



アプリケヌションをコンパむルしお実行し、怜玢を実行しおからクリックしたす。次のようなものが衚瀺されたす



画像



猫あなたはそのような喜びの代わりにゎロゎロ鳎りたいず思いたせんか



次は



おめでずうございたす、ゞェネリックに぀いお倚くのこずを孊びたしたさらに、玢匕付け、構造、前提条件など、他の興味深いこずも孊びたした。



Genericsに぀いお詳しく知りたい堎合は、Swiftチュヌトリアルの党章を参照する必芁がありたす。



コヌドの重耇を避け、繰り返し䜿甚するためにコヌドを最適化するために、将来のアプリケヌションでゞェネリックの党機胜を䜿甚できるこずを願っおいたす。質問やコメントがある堎合は、フォヌラムのディスカッションに参加しおください



All Articles