[Swift]タイプ鋳造
こんにちは!この文章はタイプ選択を整理します.私は他のプログラミング言語を勉強していたとき、UpcastingとDown castingを勉強していたときに「タイプcasting」という概念を聞いたことがあります.ほほほタイプの俳優陣とは? データ型検証 下播 💻 タイプ選択角とは?
インスタンスのタイプを決定するとき: 自分を別のタイプのインスタンスとする場合、 is演算子とas演算子を使用して、値のタイプを展開または他のタイプに変換できます.
カフェラテアメニティを利用して理解してみましょう
💻 データ型の検証
💻 タイプ選択角とは?
SWIFTはいつタイプ鋳造を使用しますか?
カフェラテアメニティを利用して理解してみましょう
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プログラミング-野熊
Reference
この問題について([Swift]タイプ鋳造), 我々は、より多くの情報をここで見つけました
https://velog.io/@vvkkiie/Swift-타입-캐스팅
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
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
では今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プログラミング-野熊
Reference
この問題について([Swift]タイプ鋳造), 我々は、より多くの情報をここで見つけました https://velog.io/@vvkkiie/Swift-타입-캐스팅テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol