Swiftのタプル

アプリケーションの作業中にSwiftでTuplesを操作することに関する情報を検索しているときに、簡単に使用できるように、1つの記事で研究または発見したすべての情報を組み合わせる方が良いと判断しました。



タプルは基本的に値であり、他のいくつかの値を含めることができます。 複合型には、他の複合型と同様に、クラス、構造、列挙(プロトコルでも、値を直接保存しないため、個別に言及する必要があります)を含む「名前付き型」も含まれる場合があります。 これは、タプルに他のタプルが含まれることがあることを意味します。 タプルに含めることができる別の複合型は、さまざまな方法で型を参照する「機能型」です。 「()>()」のような特定のスタイルでクロージャーを記述します。その関数とメソッドはそれに対応しています。 機能型には、タプルやクロージャーなどの他の複合型も含まれる可能性があります。これについては、以前の記事「 Swiftでのクロージングと定義 」で説明しました。





技術的な問題では、タプルをクラスまたは構造と考えることができます。タプルは、絶対的なクラスまたは構造(ネストまたはその逆)を定義せずにすばやく記述できるクラスまたは構造です。 AppleのiBookによると、これらはおそらく関数からの戻り値のような一時的な値にのみ使用されるべきです。 Appleはその理由を説明していませんが、それらがどのように保存されているかにより、おそらく迅速な作成のために最適化されていると推測しなければなりませんでした。 ただし、Swiftのエキサイティングな新機能の1つはいくつかのタイプの戻り値であり、タプルは技術的に単一の値(タプル自体)を返すため、Swiftがこの目標を達成するのに役立ちます。



ユーザーは、タプルがどのように英語で発音されるのかに興味がある場合があります。 Dictionary.comのオンライン辞書によると、2つの有効な発音があります。 辞書の音声表記では、/ ˈtjʊpəl /および/tʌpəl/オプションも確認できます。好奇心が強い人にとって、ʊは「took」という文字のように「oo」という文字に答える音です。 ə-これは、「約」という単語のように、文字の「a」に対応する音です。 ʌ「ガット」のような文字「u」の音。これは、これらの音がそれぞれ(おおよそ)too-puhlおよびtuh-puhlとして発音されることを意味します。 私はそれらの起源がどこから来たか知りたかったのですが、それらが主に「四重」、「五重」、「八重」のような他の単語の不可欠な部分であるという事実につまずいただけです。 個人的にはあまりにもプールを好む。



しかし、私は、英語圏の国々がそれぞれの発音基準を参照するため、発音が変わると思います。 Accidental Tech Podcastを聴く人は、 Dictionary.com huhv-er(/ ˈhʌvər)とhov-er(ˈhɒv- /ər)の両方のバリアントに明らかに同意します。 それを聞いていない人は、あなたは本当にそれをしなければなりません。

いずれにせよ、英語の音声学を勉強するためにここに来たわけではありませんが、Swiftでタプルを使用する方法を学ぶ時です!



タプルを作成する



タプルを作成するにはいくつかの方法があります。 技術的には、1つの方法が「タプルパターン」と呼ばれています。 これは、角括弧ではなく括弧で囲まれていることを除いて、リテラル配列とほとんど同じように見えます(配列内の同じ型とは異なり)。



let firstHighScore = ("Mary", 9001)
      
      







上記の方法が最も簡単です。 Swift名前付きパラメーターを利用するタプルを作成する別の方法があります。 後で、このメソッドがどのように役立つかがわかります。



 let secondHighScore = (name: "James", score: 4096)
      
      







これで本当にすべてです。 構造体である場合、内部プロパティなどとともに、コードのどこかで構造体を記述する必要があります。 クラスである場合は、自分でイニシャライザを作成する必要があります。 タプルで行う必要があるのは、値を括弧のペアに入れて、コンマで区切るだけです。 本当にしたい場合は、将来の参考のために名前を付けることもできます。



タプルからデータを取得する



タプルから読み取る方法はいくつかあります。 どちらを使用するかは、このタプルの使用場所によって異なります。 いつでもそれらのいずれかを使用できますが、おそらく特定の状況では、これらのメソッドのいずれかを他のメソッドよりも使用する方が簡単です。



まず、パターンマッチングメカニズムを使用してタプルのコンテンツをリンクできます。



 let (firstName, firstScore) = firstHighScore
      
      







この場合、パターンマッチングを使用するため、一部の値のみを使用する場合は、アンダースコアを使用して一部の値を無視することもできます。 タプルから一部の値のみを取得する場合は、次の操作を実行できます。



 let (_, onlyFirstScore) = firstHighScore
      
      







また、0から配列のインデックスと同様に開始するデフォルト名が割り当てられているため、次のように記述することもできます。



 let theName = firstHighScore.0 let theScore = firstHighScore.1
      
      







最後に、コテージを作成したときにコテージの名前を定義した場合、ポイント構文を使用するメソッドを使用してコテージにアクセスできます。



 let secondName = secondHighScore.name let secondScore = secondHighScore.score
      
      







関数からタプルを返す



これについては、以前の投稿「 Swift関数:パラメーターと戻り値の型 」で説明しましたが、この投稿にはSwiftタプルについて知っておくべきすべての情報が含まれているため、すべての情報を1か所にまとめることにしました。



ハイスコ​​アを返す関数は次のとおりです。



 func getAHighScore() -> (name: String, score: Int) { let theName = "Patricia" let theScore = 3894 return (theName, theScore) }
      
      







そのため、関数の戻り値でそれらが何であるかを呼び出しました。実際にタプルを作成したとき、名前を付けてはいけません。 返されたタプルと関数プロトタイプに返された必要なタプルは型(String、Int)であったため、コンパイラーには問題がありませんでした。 関数プロトタイプでこれらを定義したくない場合、これは正常ですが、コンパイラでは「(String、Int)」も受け入れられるため、型と戻り値の型を指定するだけです。



さらにタプルを返したい場合は、次のように戻り値の型の後に疑問符を追加するだけです。



 func maybeGetHighScore() -> (String, Int)? { return nil }
      
      







もちろん、戻りタプルはオプションであるため、値を使用するには、それを展開する必要があります。 これは、次のように追加のバインディングを介して実行できます。



 if let possibleScore = maybeGetHighScore() { possibleScore.0 possibleScore.1 } else { println("Nothing Here") }
      
      







Swiftのオプションについてもう少し知りたい場合は、以前の投稿「 Swiftのオプション-アナウンス、アンラッピング、バインド 」を読んでください



タプルと関数に関するもう1つの興味深い詳細に注意する必要があります。戻り値を決定しない関数がある場合、実際には空のタプルを返します。空のタプルは単に「()」として指定されます。 、それらはキャラクターのレイアウトがそれらをより明確にするためにのみ必要です)。



アクセス制御とタプル



私の投稿は、完全なレッスンではなく、主にSwiftプログラミング言語を説明することを目的としているため(ただし、まもなく変更されます)、最初の投稿「 Access Control in Swift 」からアクセス制御についてあまり説明しませんでした。 レッスンの作業に没頭するとすぐに、レッスンが頻繁に表示されます。



ただし、Swiftのタプルには影響します。 タプルのアクセスレベルは、コンポーネントによって決定され、プロパティまたは関数に対して設定するため、直接設定されません。 タプルのアクセスレベルは、その最も制限されたコンポーネントのアクセスレベルによって決定されます。 したがって、一方のタイプがプライベートで、もう一方のタイプがパブリックの場合、タプルのアクセス制御はプライベートになります。



タプル-値型



2014年10月7日更新:開発者Clangに感謝します。開発者Clangは、Apple Blog Swiftリクエストからの投稿に私を誘導してくれました。



上記について言及する前に、プレイグラウンドを使用して、タプルが値型であるかどうかを調べるテストを行いました。



 var someScore = ("John", 55) var anotherScore = someScore anotherScore.0 = "Robert" println(anotherScore.0) //Outputs: "Robert" println(someScore.0) //Outputs: "John"
      
      







このテストは、タプルが値型であることを実際に示しました。 someScoreを「anotherScore」という別の変数に割り当てました。 次に、anotherScore変数の値を「Robert」に変更しました。 anotherScoreの名前を確認すると、確かに「Robert」が表示されていましたが、someScore(ソース変数)を確認すると、まだ「John」という名前が表示されていました。



おわりに



この投稿のすべてのコードは、xCode 6.0.1のプレイグラウンドを使用してテストされています。

これで、タプルに関連するすべての情報が得られました。 最初、これらの部分はAppleのIbook全体に配布されていたため、最初の部分のタプルセクション、次の部分の機能、および最後の部分のアクセス制御に移動する必要があります。 情報を別々のセクションに入れることは本当に望ましいことでしたが、このブログでこれらのコンポーネントについて既に説明したので、すべてを1つの投稿で収集しました。



また、更新についてGavin Wiggins(Twitterの@wigging)にも感謝したかったです。 AppleのiBookの終わり近くにある言語リファレンスで言及されている複合型としてタプルを明示的に説明しませんでしたが、彼はこれを明確にする必要があると正しく述べました。



最初は発音に少し気を取られていましたが、面白そうに思えたので、それをあなたと共有することにしました。 あなたが好きなようにそれを発音しますが、別の発音を誰かのせいにしないでください、両方ともまったく受け入れられるからです。 しかし、私にとっては、この投稿はまだあまりにも音に関するものでした。



この投稿の「アクセス制御」セクションで言及したことについて少し続けるために、最終的にはさらに有益な投稿をする予定です。 最初は、より一般的な概念を出発点として扱いたかったのですが、最終的にはレッスンを作成することになります。



Objective-Cに関する私の投稿のいくつかを見ると、 UIDatePicker使用しキーボードを置き換える、 UIActivityViewController使用 してアプリケーションの共有を追加するなど、特定のことを行う方法に関するミニチュートリアルを行ったことがわかります。 Swift言語に関する同様の投稿が表示されます。 UIActivityViewControllerのような特定のクラスに関するものでも、キーボードの交換など、いくつかの異なる部分をまとめたより一般的な投稿でもかまいません。 いくつかのガジェットを作成すると、SwiftでのiOSプログラミングの他の側面をデモンストレーションします。これはまもなく利用可能になります。 同様の投稿(またはビデオ)がすぐに表示されるようになるまで、私は言いません。 彼らは来週、または数ヶ月後に出てくるかもしれませんが、そうなります。



この記事がお役に立てば幸いです。 もしそうなら、この投稿をTwitterや他のソーシャルネットワークで気軽に共有してください。 ブログはまだかなり新しく、すべての再投稿が役立ちます。 もちろん、質問がある場合は、Twitter @CodingExplorerで私に連絡してください。私にできることを確認します。 よろしくお願いします!



All Articles