[SWIFTプログラミング-19章]タイプ選択
21826 ワード
この文章はSWIFTプログラミング(3版、野熊の音)を読んで簡単にまとめたものです.本には親切な説明と関連するサンプルコードがあるので、自分で買って読むことをお勧めします.
スイッチは、データ型変換をサポートしないセキュリティを重視する言語です.
*Swiftの3つの言語特性:セキュリティ、高速性、より良い表現力
実際、swiftのタイプ変換は変換タイプではなく、既存の値を伝達パラメータとして受け入れることで新しいインスタンスを生成するプロセスです.
SWIFTのタイプ選択は、インスタンスタイプを確認したり、自分が別のタイプのインスタンスであるふりをしたりすることができます.
カフェラテやアメリカンコーヒーはコーヒーを受け継ぐので、コーヒーにはすべての特性があります.そのため、カフェラテやアメリカンコーヒーがコーヒーのふりをすることができます.
📌キーワード: is
タイプ解析演算子isにより、インスタンスがどのクラスのインスタンスであるかを決定します.
メタタイプは、タイプのタイプを意味します.タイプの名前の後にタイプを表します.または.selfを貼り付けることで、タイプが値で表される値を得ることができます.
タイプをtype(of:)で比較します.
.self式は値の後に書き、値自体を表し、タイプの後に書くタイプの値を返します.
📌キーワード: as? as!
Latte類の例はcoffee引き揚げ挙動として表現できる.次の図のように、エラーは発生しません.でも時々Latteのエッセンスを使いたいこの場合、親Coffeeタイプを子Latteタイプとして選択する必要があります.
キーワードはas?わあ!あります.次のオーディションに失敗する可能性は?使うべきです.CoffeeクラスからLatteクラスへ
タイプ選択は、実際にインスタンスを変更するのではなく、コンピュータがどのタイプを使用すべきかを示すものです.
スイッチは、特定のタイプを指定せずに複数のタイプの値を割り当てることができます.Anyは、関数タイプを含むすべてのタイプを表します.AnyObjectはクラスタイプのみを表します.比較クラスなのでAnyObjectを使用しました.
swiftはタイプ上のセキュリティが重要で、使用を避けるべきです.
偽コーヒーのタイプをチェックするとコーヒーが表示され、type(:)で確認するとカフェラテと表示されます.
Anyタイプは,傍観者を含むすべての値タイプを表す.しかし、Anyタイプに上昇値を入れると警告が出ます.通常print()関数を考慮できます.
19.0概要
スイッチは、データ型変換をサポートしないセキュリティを重視する言語です.
*Swiftの3つの言語特性:セキュリティ、高速性、より良い表現力
19.1切替タイプ
実際、swiftのタイプ変換は変換タイプではなく、既存の値を伝達パラメータとして受け入れることで新しいインスタンスを生成するプロセスです.
@frozen public struct Int : FixedWidthInteger, SignedInteger {
public init(_ source: Float16)
public init?(exactly source: Float16)
public init(_ source: Float)
public init?(exactly source: Float)
public init(_ source: Double)
public init?(exactly source: Double)
public convenience init?<S>(_ text: S, radix: Int = default)
where S : StringProtocol
...
Doubleタイプ1.5を受け入れ、新しいInt構造体を生成します.あるいは、文字列などの不適切なパラメータが渡された場合、インスタンスの作成は失敗します.let int: Int = Int(1.5) // 1
let notInt = Int("a") // nil
19.2 SWIFTタイプ鋳造
SWIFTのタイプ選択は、インスタンスタイプを確認したり、自分が別のタイプのインスタンスであるふりをしたりすることができます.
コーヒー類
class Coffee {
let name: String
let shot: Int
var description: String {
return "\(shot)샷 \(name)"
}
init(shot: Int) {
self.name = "커피"
self.shot = shot
}
}
ラテ類
class Latte: Coffee {
let flavor: String
override var description: String {
return "\(shot)샷 \(flavor) 라떼"
}
init(flavor: String, shot: Int) {
self.flavor = flavor
super.init(shot: shot)
}
}
アメニティ類
class Americano: Coffee {
let iced: Bool
override var description: String {
return "\(shot)샷 \(iced ? "아이스" : "") 아메리카노"
}
init(iced: Bool, shot: Int) {
self.iced = iced
super.init(shot: shot)
}
}
コーヒー、カフェラテ、アメニティのグレード継承
コーヒー、カフェラテ、アメニティも含まれています
カフェラテやアメリカンコーヒーはコーヒーを受け継ぐので、コーヒーにはすべての特性があります.そのため、カフェラテやアメリカンコーヒーがコーヒーのふりをすることができます.
19.3データ型検証
1. is
📌キーワード: is
タイプ解析演算子isにより、インスタンスがどのクラスのインスタンスであるかを決定します.
let coffee = Coffee(shot: 1)
coffee.description // 1샷 커피
let latte = Latte(flavor: "카라멜", shot: 2)
latte.description // 2샷 카라멜 라떼
let americano = Americano(iced: true, shot: 2)
americano.description // 2샷 아이스 아메리카노
coffee is Latte // false
coffee is Americano // false
latte is Coffee // true
americano is Coffee // true
スイッチドアを使って飲み物の種類を確認します.func checkType(_ drink: AnyObject) {
switch drink {
case is Latte: print("This is latte")
case is Americano: print("This is americano")
case is Coffee: print("This is coffee")
default: break
}
}
let latte = Latte(flavor: "카라멜", shot: 2)
checkType(latte) // This is latte
2.Metaタイプ
メタタイプは、タイプのタイプを意味します.タイプの名前の後にタイプを表します.または.selfを貼り付けることで、タイプが値で表される値を得ることができます.
let int = Int.self
let double = Double.self
int == double // false
3. type(of: )
タイプをtype(of:)で比較します.
type(of: latte) == Coffee.self // false
type(of: latte) == Latte.self // true
.self
.self式は値の後に書き、値自体を表し、タイプの後に書くタイプの値を返します.
"a".self == "a" // true
type(of: 1) == Int.self // true
19.4降格
📌キーワード: as? as!
Latte類の例はcoffee引き揚げ挙動として表現できる.次の図のように、エラーは発生しません.でも時々Latteのエッセンスを使いたいこの場合、親Coffeeタイプを子Latteタイプとして選択する必要があります.
キーワードはas?わあ!あります.次のオーディションに失敗する可能性は?使うべきです.CoffeeクラスからLatteクラスへ
if let latte = fakeCoffee as? Latte {
print(latte.flavor) // 가짜
}
タイプ選択の真の意味
タイプ選択は、実際にインスタンスを変更するのではなく、コンピュータがどのタイプを使用すべきかを示すものです.
19.5 Any,AnyObjectのタイプ鋳造
スイッチは、特定のタイプを指定せずに複数のタイプの値を割り当てることができます.Anyは、関数タイプを含むすべてのタイプを表します.AnyObjectはクラスタイプのみを表します.比較クラスなのでAnyObjectを使用しました.
swiftはタイプ上のセキュリティが重要で、使用を避けるべきです.
FakeCoffeeタイプ出力?
偽コーヒーのタイプをチェックするとコーヒーが表示され、type(:)で確認するとカフェラテと表示されます.
func checkType(of item: AnyObject) {
switch item {
case let item as Coffee: print("커피입니다")
case let item as Latte: print("라떼입니다")
case let item as Americano: print("아메리카노입니다")
default: print("모르겠어요")
}
}
checkType(of: coffee) // 커피입니다
checkType(of: fakeCoffee) // 커피입니다
print(type(of: fakeCoffee)) // Latte
傍観者とAny
Anyタイプは,傍観者を含むすべての値タイプを表す.しかし、Anyタイプに上昇値を入れると警告が出ます.通常print()関数を考慮できます.
let optionalInt: Int? = 1
print(optionalInt) // Expression implicitly coerced from 'Int?' to 'Any'
print(optionalInt as Any)
Reference
この問題について([SWIFTプログラミング-19章]タイプ選択), 我々は、より多くの情報をここで見つけました https://velog.io/@leeesangheee/스위프트-프로그래밍-19장-타입캐스팅テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol