Swift:タプル

StructLite™とも呼ばれます(実際にはそうではありません)

タプルタイプはObjective-C開発者にとってはやや異質な概念であり、astructまたはclass。と混同されることがあります。しかし実際には、それらは両方よりもはるかに基本的です。私はそれらを、最小限のスコープ内で使用してから破棄する必要があるミニチュア構造体またはStructLite™と考えるのが好きです。

Swiftタイプに関するAppleのドキュメントによると:

タプル型は、括弧で囲まれた0個以上の型のコンマ区切りのリストです。

それらは他の異なるタイプの単なる化合物です。タプルは、一般に、ゼロ又はそれ以上のタイプを含んでいてもよいString、Integer、Boolならびに他のタプル。また、タプルは参照ではなく値で渡されることに注意してください。

let foo = (0, false, “Hello”)

let foo: (Int, Bool, String) = (0, false, “Hello”)

print(foo.0) // print: “0”
print(foo.1) // print: “false”
print(foo.2) // print: “Hello”

let bar: (Int, (Bool, String)) = (1, (false, “Hello”))
print(bar.0)   // print: “0”
print(bar.1.0) // print: “false”
print(bar.1.1) // print: “Hello”

ただし、インデックスを使用して、どれがどの値に対応するかを覚えておく必要はなく、可能な限りタプルのプロパティに名前を付けることをお勧めします。

let person = (age: 28, isTall: false, name: “Andyy”)
print(person.age)    // print: “28”
print(person.isTall) // print: “false”
print(person.name)   // print: “Andyy”

タプルを使用するのに最適な場所は、複数の型を返すことができる関数が必要な場合です。あなたがObjective-C開発者なら、この概念は奇妙に聞こえ、おそらく不可能ですらあります。以前は、NSArrayまたはを返すことでこのような問題を克服する必要がありましたNSDictionary。しかし、その解決でさえ危険な場合があります。の間違ったオブジェクトを型キャストして、そのオブジェクトでNSArray特定の関数を呼び出そうとするとどうなるでしょうか。実行時にクラッシュする可能性があります。

代わりに、Objective-Cの制限に対する短期間のハッキーな解決策を考え出す代わりに、関数が複数の値を返すようにする方法を見てみましょう。

typealias Person = (age: Int, isTall: Bool, name: String)
func getMultipleValues() -> Person {
let person: Person = (age: 28, isTall: false, name: “Andyy”)
return person
}
let andyy = getMultipleValues()
print(andyy.age)    // print: "28"
print(andyy.isTall) // print: "false"
print(andyy.name)   // print: "Andyy"

しかし、上記のようにgetMultipleValues() 、それぞれが対応する変数名を持つ3つの別々の異なるデータ型のタプルを返す関数呼び出しがあります。

構造体のインスタンス化(非推奨)

更新:これは非推奨になりますSwift 3.0
提案:SE-0029
関数適用から暗黙のタプルスプラット動作を削除します

この投稿の冒頭で、私は冗談めかしてタプルをStructLite™と呼びました。あまり知られていない事実は、タプルを使用して構造体をインスタンス化できることです。

let size = CGSize(width: 100, height: 100)

let arguments: (width: CGFloat, height: CGFloat) = (100, 100)
var size = CGSize(arguments)

let arguments: (height: CGFloat, width: CGFloat) = (100, 100)
❗️ var size = CGSize(arguments) 

私がそこで何をしたかわかりますか?heightとwidth 場所を入れ替えて、引数の配置を変更しました。両方ともですがCGFloat、コンパイラーはユーザーが何をしようとしているのかを推測できません。

興味深い事実

以前にSwiftを使用したことがある場合は、戻り値の型にタプルを実際に使用したことがある可能性があります。それを知らないだけです。以下に3つの別々の関数があり、それらはすべてまったく同じこと(何もしない)を実行し、いずれも値を返しません。

func doNothingA() -> Void { }
func doNothingB() -> () { }
func doNothingC() { }

クールな事は、あるVoidだけであるtypealiasために()その実際には空のタプル、。この投稿の冒頭で覚えていると思いますが、タプルには0個以上の型を含めることができると述べました。

マインド。吹き飛ばされた。どういたしまして。

発音を選択してください

人々が「タプル」という言葉をどのように発音するかについては、大きな混乱があります。「ツープル」と言う人もいれば、「Tup-pl」と言う人もいれば、最もクレイジーな人は「Choo-pl」と言う人もいます。あなたの好みが何であれ、それに声をかけられる準備をしてください。

この投稿のサンプルコードはGitHubにあります。これは、少し理解を深めるのに役立つ単純なPlaygroundsファイルです。

今日読んだものが気に入ったら、他の記事をチェックしたり、連絡を取りたい場合は、ツイートを送信するか、Twitterでフォローしてください。本当に私の一日になります。また、オーストラリアのメルボルンでPlaygrounds Conferenceを開催し、次のイベントでお会いしましょう。

提案された投稿

ドメイン名に関する情報の検索

Brian P. Hogan 著『Small, Sharp Software Tools』からの抜粋

ドメイン名に関する情報の検索

facebook.com にリクエストを送信すると、コンピュータはドメイン名を検索してそのドメイン名を IP アドレスに変換し、コンピュータが接続できるようにします。

「その小さな島がすべてを変える」

ライダーのエクスペリエンスを向上させるために Lyft ライブ アクティビティをどのように設計したか

「その小さな島がすべてを変える」

ライドシェアの変革者 Lyft で行っているすべての業務の中で、乗客とドライバー間の送迎の振り付けは、最も複雑かつ重要な作業の 1 つです。この振り付けを成功させるには、Lyft が多くのことをうまくやっているかどうかにかかっていますが、単にライダーをスピードに乗せ続けることが不可欠です。

関連記事

ドメイン名に関する情報の検索

Brian P. Hogan 著『Small, Sharp Software Tools』からの抜粋

ドメイン名に関する情報の検索

facebook.com にリクエストを送信すると、コンピュータはドメイン名を検索してそのドメイン名を IP アドレスに変換し、コンピュータが接続できるようにします。

仕事週間で学ぶことはあなたが思っている以上に重要です

仕事週間で学ぶことはあなたが思っている以上に重要です

私たちは、自分にとって良いとわかっていることを実行するのに苦労していることによく気づきます。大切な人に愛していると伝えることから、海賊のように話すことを忘れないことまで、すでにそうしたことを行っているため、1日、1週間、または1か月のイベントは必要ないと主張する人が常にいます。

その脅威アーカイブ: Vol 7 ブラックバスタ

その脅威アーカイブ: Vol 7 ブラックバスタ

今日の相互接続された世界では、サイバー攻撃の脅威がかつてないほど蔓延しています。サイバー犯罪者や国家主体は常に脆弱性を悪用して貴重なデータを盗もうとしており、あらゆる規模の組織に重大なリスクをもたらしています。

無限の命

大人になると、世界はそういうもので、あなたの人生はただ世界の中で生きていくだけで、決して命を危険にさらすことはなく、決められた道をたどって最後には死ぬだけで、失敗しないように努めるのだと言われがちです。壁を打ちすぎてはいけません。しかし、それは非常に限られた人生です。