iPhone
 Computer >> コンピューター >  >> スマートフォン >> iPhone

Generics と Swift の Any 型の違いを分析しましょう

Swift は、現在最もタイプセーフな言語の 1 つです。 ???

ああ、待って!!言語が型安全であるとはどういう意味ですか? ?

型安全な言語により、その時点で利用可能な適切な種類のデータで操作が機能することが常に保証されます。✓

言語にさまざまなデータ型 (例:Int、Float、String、Array、Dictionary) を宣言する機能があり、特定のデータ型で宣言された変数が異なる種類の変数を決して保持しないようにする機能もある場合。

型安全な言語では、型チェックは常に行われます。言語によっては、コンパイル時または実行時に発生する可能性があります.✅

さて、Swift のジェネリックとは??

ジェネリックは型安全であり、柔軟で再利用可能な関数と型を書くのに役立ちます。 Generics を使用すると、すべてのデータ型で機能するコードを記述できます。 Swift は型安全な言語であるため、これを壊すことなく、コードの重複を避けることができる汎用コードを書くことができます。

簡単な例を見てみましょう:Array は、同じタイプのデータを保持できる順序付けられたコレクションです。そのため、Array の定義では、Element のジェネリック型を取ることがわかります。 したがって、配列はジェネリック タイプのコレクションになります。 .

わかりました。涼しい。では、Swift の Any 型とは何ですか? ???

Swift は Any 型もサポートしています。名前が示すように、構造体、クラス、列挙型、関数型などの任意の型のインスタンスを表すことができます。

では、Objective C id と Swift の Any は同じですか? ?

Swift 3 では、Objective C の id type は Swift の Any 型にマップされます。これにより、Swift と Objective C の互換性が向上します。

しかし、どのように、なぜ??

Swift 2 では、Objective C の id Swift の Any オブジェクトにマッピングされました。これはほとんどの場合にうまく機能しましたが、予期しない動作が発生する場合がありました。 Swift の重要な概念の 1 つは値の型であり、このマッピングはこの概念を正しく評価していませんでした。

Swift は iOS 開発用の新しい言語にすぎず、Objective C は何年も前から存在しています。もちろん、ほとんどのプロジェクトは Objective C のみで開発されました。ここで、Objective プロジェクトを Swift プロジェクトに変換するために、任意の Swift タイプを任意の Objective C オブジェクトにブリッジできる必要があるという要件が生じました。

しかし、Swift のクラスや、Int、String、Float などの Swift の値の型には問題はありませんでした。それらにはすでに対応する Objective C があるからです。この問題は、対応する Objective C がない Swift の値の型で発生しました。

これを修正するために、Swift Any 型にマップされた Objective C id 型.✅✅✅

定義は十分ですか?.では本題に入りましょう。以上の点から、Generics と Any 型は同じように見えます。しかし、それは本当ですか???

大まかに言うと、Any は Generics に似ているかもしれません。しかし、いくつかの違いを見つけてみましょう-???

私たちは皆、スタックが何であるかを知っています はデータ構造にありますよね?スタックは、項目の挿入と削除が一方の端でのみ行われる基本的な線形データ構造です。

Swift で Stack 構造を実装します。まず、ジェネリックを使用して実装し、次に Any 型を使用します。

ジェネリックを使用したスタックの実装:

上記の Stack 実装は Generics を使用しています。構造体は Element のジェネリック型を取ります アイテムを使用し、そのアイテムを使用してスタックを実装します。それでは、ジェネリック スタックを使用していくつかの操作を行いましょう:

整数型の要素を保持できるジェネリック スタックを宣言します。整数要素をスタックにプッシュしています。ここまでは、すべて問題なく動作しています。

でも、float 要素を genericStack の上にプッシュしたい場合はどうすればよいでしょうか?

Generics と Swift の Any 型の違いを分析しましょう

❌❌ おっと!コンパイル エラー! ❌❌

Any 型を使用したスタックの実装:

このスタック実装では、項目配列は任意のタイプの要素を保持できます。 items の正確なデータ型については指定していません 定義の配列要素。次に、このスタックで同じ基本操作を行いましょう:

問題ありませんよね?ここでもすべてが正常に機能しています。最初に、スタックを宣言し、2 つの整数要素をスタックにプッシュしました。 show() を呼び出すと、 メソッドでは、正確な配列 [3, 4]. を出力します。

では、float 値をそれにプッシュしましょう。☄️

Generics と Swift の Any 型の違いを分析しましょう

✅✅ エラーなし!すべてがうまくいきます! ✅✅

舞台裏で何が起こっているのか?なぜエラーが発生しないのですか??? ?

ジェネリックは基本的にコンパイラに次のことを伝えます:

ジェネリック型を宣言しました。後で正確な型を示します。私が指定したすべての場所にそのタイプを適用してほしい.

Any 型は基本的にコンパイラに次のことを伝えます:

この変数について心配する必要はありません。ここで型を適用する必要はありません。やりたいことは何でもできます。

汎用関数を使用して柔軟な関数を定義できますが、引数の型は引き続きコンパイラによってチェックされます。 Swift の型システムをかわすために任意の型を使用できますか?

ジェネリック スタック宣言内 、スタックが整数型のみを取る必要があることをコンパイラーに伝えています。次に、float 型の要素を挿入しようとすると、その約束を破っていることになります。したがって、コンパイル時エラーがスローされます。要素が整数型であることを常に想定しています。

ただし、任意のスタックの場合 、コンパイル時または実行時エラーは発生していません。 show() を呼び出しても メソッドでは、スタックを [3, 4, 5.0] として出力します。 これは、スタックが整数型と浮動小数点型の値を保持することを意味します。したがって、どのスタックにも型の制限はなく、任意の型の値をスタックにプッシュできます (ただし、実行時例外が発生する可能性があります)。

結論

したがって、ジェネリックを使用すると、Swift の型安全性を損なうことなく、柔軟な関数、構造、クラス、およびプロトコルを作成できます。しかし、Any 型を使用すると、私たちは自分自身のボスのような存在になり、やりたいことはほとんど何でもできます。

???乾杯!!!読んでくれてありがとう!! ???


  1. ビットコインとイーサリアムの違い

    2017年は間違いなく暗号通貨の年であり、価格が下がったとしても、特に主要通貨への関心は下がっていません。最も人気のある2つの通貨であるビットコインとイーサリアムは、年間で大幅な価格上昇を見せました。それぞれ、1,000ドル未満から20,000ドル近く、10ドル未満から1,300ドル超になりました。暗号通貨への投資に興味がある場合は、ビットコインとイーサリアムの違いについて簡単に説明します。 1。ビットコインはジェネレーション1、イーサリアムはジェネレーション2 ビットコインは、世間の注目を集めた最初の主要な暗号通貨でした。ある意味、初代です。イーサリアムは数年後に登場し、ビットコインをベ

  2. Windows 10 と Windows 11 の違いは?

    Microsoft は最新の Windows 11 をリリースし、多くの新機能と改善を行いました。また、多くのパッチとアップデートにより、Windows 10 は新しい Windows 11 よりも安定した OS になりました。同社によると、2025 年以降に Windows 10 でのサポートが終了するため、Windows 11 または Windows 10 へのアップグレードを決定するのに十分な時間があります。 Windows 10 を快適に使用してください。この記事では、Windows 10 と Windows 11 の比較を用意しました。 新しい OS に切り替えるか、Windows