[Swift]タイプ鋳造


こんにちは!この文章はタイプ選択を整理します.私は他のプログラミング言語を勉強していたとき、UpcastingとDown castingを勉強していたときに「タイプcasting」という概念を聞いたことがあります.ほほほ
  • タイプの俳優陣とは?
  • データ型検証
  • 下播
  • 💻 タイプ選択角とは?


    SWIFTはいつタイプ鋳造を使用しますか?
  • インスタンスのタイプを決定するとき:
  • 自分を別のタイプのインスタンスとする場合、
  • is演算子とas演算子を使用して、値のタイプを展開または他のタイプに変換できます.
    カフェラテアメニティを利用して理解してみましょう
    class Coffee {
    	let name: String
        let shot: Int
        
        var description: String {
        	return "\(shot) shot(s) \(name)"
        }
        
        init(shot: Int) {
       		self.shot = shot
            self.name = "coffee"
        }
    }
    
    class Latte: Coffee {
    	var flavor: String
        
        override var description: STring {
        	return "\(shot) shot(s) latte"
        }
        
        init(flavor: String, shot: Int) {
        	self.flavor = flavor
            super.init(shot: shot)
        }
    }
    
    class Americano: Coffee {
    	let iced: Bool
        
        override var description: STring {
        	return "\(shot) shot(s) americano"
        }
        
        init(shot: Int, iced: Bool) {
        	self.iced = iced
            super.init(shot: shot)
        }
    }
    LatteとAmericanoクラスはCoffeeクラスを継承しています.

    💻 データ型の検証


    swiftは、タイプ選択がデータ型を確認するために使用できると述べた.演算子ifを使用!
    言ったように理解すればいい例を挙げると分かりやすいです
    let coffee: Coffee = Coffee(shot: 1)
    let myCoffee: Americano = Americano(shot: 2, iced: false)
    let yourCoffee: Latte = Latte(flavor: "green tea", shot: 3)
    
    print(coffee is Coffee) //true
    print(coffee is Americano) //false
    print(coffee is Latte) //false
    
    print(myCoffee is Coffee) //true
    print(myCoffee is Latte) //false
    
    print(yourCoffee is Coffee) //true
    print(yourCoffee is Latte) //true
    coffeeインスタンスはcoffeeタイプであり、LatteeまたはAmericanoタイプではありません.
    ただし、myCoffeeはアメニティタイプなのでアメニティとCoffeeで良いのですが、Latteではありません.
    これをisで確認しました.

    💻 せんたくかく


    では今asを利用して次のラウンドの選角を行いましょう!
    さすがswift as!わあ.存在する.
    もしあなたがオセナを習ったことがあるなら、as?見ると見張りパイオニアですか?思い出すよ(だって、私もなかなか思い出せないので、)
    as?下流castingが失敗した場合はnilを返し、戻りタイプは「傍観者」です.
    as!下流鋳造に失敗すると、実行時エラーが発生し、返されるタイプは外部ではありません.
    だから、『守望先鋒』を勉強した時のように、失敗する可能性はありますか?使用する必要があります.
    もちろんasも使えます.成功を常に知っている場合は、asを使用します.
    では今、前のコーヒー類を利用して次のコーナーを選びましょう
    if let coffeeOne: Americano = coffee as? Americano {
    	print("This is Americano")
    } else {
    	print(coffee.description)
    }
    このようにコードを書いた場合、結果はどうなりますか?
    if let coffeeOne: Americano = coffee as? Americano
    まず説明しますが、
    coffeOne参照のインスタンスがAmericanoであり、coffe参照のインスタンスがAmericanoタイプのインスタンスである場合、coffeOneという一時定数に割り当てられます.
    と解釈できます.
    coffeeが引用した例はアメリカンコーヒータイプの例ですか?
    正解は間違ってるでしょ?!
    コーヒー.description inshot(s)coffeeが出力されます.
    if let coffeeOne: Americano = myCoffee as? Americano {
    	print("This is Americano")
    } else {
    	print(coffee.description)
    }
    では、このコードの出力は何でしょうか.
    coffeeOneが参照する例はAmericanoです.
    myCoffeeが参照するインスタンスはアメリカンインスタンスであるため、coffeeOneという一時定数に割り当てることができます.
    したがって、出力値は「This Americano」となります.
    if let coffeeOne: Coffee = myCoffee as? Coffee {
    	print("This is Just Coffee.")
    } else {
    	print(coffee.description)
    }
    もう一つ整理しよう
    coffeeOneが参照するインスタンスはcoffeeです.myCoffeeが参照するインスタンスはCoffeeタイプであるため、coffee Oneに割り当てられる出力値はThis Just Coffeeである.
    今回はas!使ってみます.
    let castedCoffee: Coffee = yourCoffee as! Coffee
    
    let castedAmericano: Americano = coffee as! Ameicano
    この2行のコードを書きます.1行は成功し、1行は実行時にエラーが発生しました.
    どちらが成功しますか?
    yourCoffeeが参照するインスタンスはCoffeeタイプのインスタンスであるため、ダウングレードに成功します.
    しかし、2度目の強制降格は失敗する.
    では、asを使用すると、コンパイラは降格したかどうかを判断できますか?
    let castedCoffee: Coffee = yourCoffee as Coffee
    たとえば、選択するタイプが同じタイプまたは親タイプであることを知っている場合.
    こうしてタイプ選択コーナーをまとめました😀
    出典:SWIFT SWIFTプログラミング-野熊