is、as、asの違いは何ですか?、として! swiftで? さて、チェックしてみましょう。型キャストは、インスタンスの型をチェックする方法、またはそのインスタンスを独自のクラス階層内の別の場所から別のスーパークラスまたはサブSwiftの型キャストはisas演算子で実装されています。 isは値の型をチェックするために使用されますが、asは値を別の型にキャストするために使用されます。

次のクラスLivingBeingHumanAnimalという名前のLivingBeingの二つのサブクラスを考えてみましょう。

次に、1つのAnimalクラスオブジェクトと1つのhumanクラスオブジェクトを持つlivingBeingArrayという定数配列を作成します。 型推論によって作成されたこの配列の型はどう思いますか? タイプはになります。Swiftのタイプチェッカーは、HumanAnimalLivingBeingの共通のスーパークラスを持っていることを推測することができるため、livingBeingArray配列のタイプを推測します。

Swiftのタイプチェ

livingBeingArrayに格納されているアイテムは、舞台裏ではまだHumanAnimalのインスタンスです。 ただし、この配列の内容を反復処理すると、返される項目はHumanまたはAnimalではなくLivingBeingとして入力されます。 それらをネイティブタイプとして使用するには、それらのタイプをチェックするか、別のタイプにダウンキャストする必要があります。

型チェック演算子(is)を使用して、インスタンスが特定のサブクラス型であるかどうかをチェックします。 型チェック演算子は、インスタンスがそのサブクラス型の場合はtrueを返し、そうでない場合はfalseを返します。

次のコードを考えてみましょう:

let livingBeingObj = livingBeingArray // returns a LivingBeing object.

配列オブジェクトをforループで反復してみましょう。

for item in livingBeingArray {if item is Animal {print("item is of type Animal")// will get executed for first item} else if item is Human {print("item is of type Human")// will get executed for second item}}

ダウンキャスト

Apple docは言う:特定のクラスタイプの定数または変数は、実際に舞台裏でサブクラスのインスタンスを参照することができます。 これが事実であると思われる場合は、型キャスト演算子(as?またはas!)を使用してサブクラス型にダウンキャストしようとすることができます。

これを単純化しましょう。 配列livingBeingArrayを考えてみましょう。 最初の項目のタイプはAnimalであることがわかっています。 配列には1つのAnimalオブジェクトと1つのHumanオブジェクトが含まれているため、型推論は配列の型をLivingBeingとして決定します。 この配列からコンテンツを取得しようとすると、LivingBeing.型のオブジェクトが返されますその場合、配列から取得した後にダウンキャストしようとするこ

asとの違いは? そして、として!

ダウンキャストは二つの方法で行うことができます:

  • 条件付きダウンキャスト(as?).
  • 強制ダウンキャスト(as!).

条件付きフォームas?は、ダウンキャストしようとしている型のオプションの値を返します。 強制フォームas!は、ダウンキャストを試み、結果を単一の複合アクションとして強制解除します。

ダウンキャストが成功するかどうかわからない場合は、型キャスト演算子(as?)の条件付き形式を使用します。 この形式の演算子は常にオプションの値を返し、ダウンキャストが不可能な場合は値はnilになります。 これにより、ダウンキャストが成功しているかどうかを確認できます。

型キャスト演算子(as!)の強制形式は、ダウンキャストが常に成功することが確実な場合にのみ使用します。 この形式の演算子は、誤ったクラス型にダウンキャストしようとすると、ランタイムエラーをトリガーします。

上記のシナリオでは、配列の最初のオブジェクトがAnimal型であることがわかっているため、強制ダウンキャストを使用できます。

let animalObj = livingBeingArray as! Animal //forced downcasting to Animallet humanObj = livingBeingArray as! Human //forced downcasting to Human

しかし、最初のオブジェクトをHumanに、2番目のオブジェクトをAnimalにダウンキャストしようとすると、強制ダウンキャストが失敗する可能性があります。 この場合、結果はnilになり、通常の型では処理できず、プログラムはクラッシュします。

let animalObj = livingBeingArray as! Human //error and crasheslet humanObj = livingBeingArray as! Animal //error and crashes

このシナリオでは、キャストが成功するかどうかわからない場合は、条件付きダウンキャストas?を使用する必要があります。

let animalObj = livingBeingArray as? Human //nil..animalObj is of Human? (optional Human which is the type which we tried to downcast to)let humanObj = livingBeingArray as? Animal //nil..humanObj is of Animal? (optional Animal which is the type which we tried to downcast to)

しかし、正しい型の条件付きダウンキャストは成功し、ダウンキャストしようとしている正しいoptional型を返します。

let animalObj = livingBeingArray as? Animal // success, returns Animal?let humanObj = livingBeingArray as? Human // success, returns Human?

アップキャスト

基底クラスオブジェクトからそのスーパークラスへのアップキャストも可能です。 強制ダウンキャストによって作成されたanimalObjectLivingBeingクラスに変換してみましょう。

let animalObj = livingBeingArray as! Animal
let animalObjectAsLivingBeingObj = animalObj as LivingBeing

animalObjectAsLivingBeingObj タイプはLivingBeingです。

AnyとAnyObjectの型キャスト

Swiftには、非特異的な型を扱うための二つの特別な型が用意されています:

  • Any 関数型を含む任意の型のインスタンスを表すことができます。
  • AnyObjectは、任意のクラス型のインスタンスを表すことができます。

Source:Internet

キーワード’Any’は、関数型を含む任意の型に属するインスタンスを表すために使用されます。 異なる型の値を受け入れることができるAny型の配列を考えてみましょう。 Switch文を使用して型をcheclし、ダウンキャストを行うことができます。

var groups = ()
groups.append(1.0)
groups.append(1)
groups.append("string")
for item in groups {
switch item {
case let anInt as Int:
print("\(item) is an int")
case let aDouble as Double:
print("\(item) is a double")
case let aString as String:
print("\(item) is a string")
default:
print("dunno")
}
}
/*
1.0 is a double
1 is an int
string is a string
C11lldb_expr_13Pop (has 1 child) is a Genre
*/

強制ダウンキャストと条件付きダウンキャストは、switch-case

では機能しません

コメントを残す

メールアドレスが公開されることはありません。