[SWIFTプログラミング-19章]タイプ選択


この文章はSWIFTプログラミング(3版、野熊の音)を読んで簡単にまとめたものです.本には親切な説明と関連するサンプルコードがあるので、自分で買って読むことをお勧めします.

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)