https://youtu.be/ibzqQdv8z6I
今回は、前々回に話した タプル
の機能的なところについてもう少しだけ眺めてみてから、引き続いて The Basics の オプショナル
について見ていこうと思ってます。オプショナルといえば Swift のコンセプトを支える大事な機能にも当たるところで、見どころも多くなってきますけれど、今回はその初歩的なところまで見ていけたら万々歳な感じがします。よろしくお願いしますね。
————————————————————————————————— 熊谷さんのやさしい Swift 勉強会 #133
00:00 開始 00:30 前々回の振り返り 01:24 タプルの要素を取り出す 02:22 タプルの要素へのアクセス 03:47 キーパスによるタプルへのアクセス 05:18 タプルの要素への書き込み 05:47 タプルのキーパスとラベルの関係 08:21 キーパスによる読み取りと書き込みで挙動が異なる例 13:07 タプルのラベルとメモリーレイアウトの関係性 15:47 タプルの要素の振り替え 16:42 キーパスを使う場面 18:10 リフレクションを使ったプロパティーの参照 20:46 ラベルの異なるタプルを型パラメーターで扱う 22:08 引数でラベルの異なるタプルを渡してみる 23:26 タプルの値までいけば、ラベルの有無を構わず振り替え可能 24:14 ラベルの有無を Array は吸収する? 26:18 メタタイプはタプルのラベルを持つ? 27:06 クロージング —————————————————————————————————
Transcription & Summarize : 熊谷さんのやさしい Swift 勉強会 #133
では、勉強会を始めますね。今日はタプルについてお話しします。予告ではオプショナルの話もすると言いましたが、時間が足りなければタプルの話だけで終わるかもしれません。その点はご了承ください。
以前の勉強会ではタプルの基礎的な話をしましたが、今日はもう少し進めていきます。前々回ではタプルスプラットについて話しましたね。もう少し基礎的な部分も見ていく必要がありますので、そのあたりを確認していきましょう。
まず、タプルの分解についてです。タプルは、複数の要素をまとめて一つの変数に格納するための構造です。これを分解する方法はいくつかあります。前回はタプルパターンという方法を使って、スイッチ文でタプルを分解する方法についてお話ししました。これに加えて、.0
, .1
のように0から始まるインデックスでタプルの要素を取得することもできます。さらに、タプルにはラベルを付けることもできるので、名前で要素にアクセスすることも可能です。
例えば、次のようにできます:
let person: (name: String, age: Int) = (name: "John", age: 30)
print(person.name) // "John"
print(person.age) // 30
ラベルを付けることでコードの可読性が向上しますが、番号による参照も可能です。これにより、柔軟にアクセス方法を選ぶことができます。
また、比較的最近のトピックとして、タプルでもキーパスを使用できるという話題があります。例えば、Int
とString
のタプルの0番目の要素に対応するキーパスを次のように指定できます:
let keyPath = \\((Int, String)).0
これにより、タプルの要素に対して動的にアクセスすることができます。タプルがキーパスをサポートしている点は個人的に面白いと思います。他のデータ構造と同様にタプルの値にアクセスできるので、さまざまな場面で応用が可能です。
ただし、動的にアクセスする際に、キーパスは書き込みができない場合があります。書き込み可能なキーパスの場合、利用方法が限られます。例えば、次のようにタプルの要素を書き換えることもできますが、ミラーを使うことで書き込みはできません:
var person: (name: String, age: Int) = (name: "John", age: 30)
person.age = 31
print(person.age) // 31
キーパスを使って同様に書き換える方法があるかどうか、具体的には次のようなところに注意が必要です:
let keyPath = \\((Int, String)).1
これで1番目
の要素(つまり、String
)のキーパスを取得して、タプルの要素を変更する場合はどうなるか、などの確認です。
キーパスの操作は少し難しいかもしれません。特に書き込みが関わる場合、いくつかの制約に注目する必要があります。何か具体的な実装例があれば、それを見ながら理解を深めていくと良いでしょうね。
以上がタプルについての基本的な話と、少し進んだ内容のお話でした。質問などあれば、ぜひ声をかけてください。 ライトアブルキーパスに関して説明していますね。書き換え可能であれば、それをキーパスに指定して書けると考えているようです。しかし、今エラーが出ているのはラベルが関連しているからかもしれません。コードが動くか試していますが、変だという意見があります。
ラベルがある場合にはラベルを指定すれば良いのですが、スクリプトキーパスにタイプミスマッチがあるかもしれません。型が一致していない場合のトラブルを検証しているようです。そのため、イニシャライザ(init
)においてタプルを渡す際の話をしています。
デフォルトイニシャライザが必要であり、アーギュメントを一斉に取ることを試しても結果は同じのようです。タプルに関してさらに踏み込んだ検証を行った結果、型が一致しないとエラーになることを確認しています。ラベル付きとラベルなしのタプルの違いについても触れています。
次に配列に対する検証をしています。配列にラベル付きのタプルを代入する際の挙動についても試していますが、配列は特別扱いされるため、その違いに戸惑っているようです。下情報にラベルを付けた状態で型を確認するテストも行っていますが、配列に関して特別扱いがあることに落ち着いています。タプルの扱いが大変であると感じつつ、勉強会は終了に近づいています。最後に、本日の勉強会を締めくくる文言で終了しています。
お疲れさまでした。