スウィフト型鋳造

3670 ワード

型キャスティングは、型のインスタンスを別のスーパークラスまたはサブクラスとして扱い、ASとIS演算子で実装されたインスタンスの型をチェックする方法です.
これは、型がプロトコルに準拠するかどうかをチェックするためにも使用できます.

チェックタイプ


  • is operatorは、インスタンスがある型かサブクラス型かを調べるために使用します.
  • 例:
    class MediaItem {
        var name: String
        init(name: String) {
            self.name = name
        }
    }
    
    class Movie: MediaItem {
        var director: String
        init(name: String, director: String) {
            self.director = director
            super.init(name: name)
        }
    }
    
    class Song: MediaItem {
        var artist: String
        init(name: String, artist: String) {
            self.artist = artist
            super.init(name: name)
        }
    }
    
    let library = [
        Movie(name: "Casablanca", director: "Michael Curtiz"),
        Song(name: "Blue Suede Shoes", artist: "Elvis Presley"),
        Movie(name: "Citizen Kane", director: "Orson Welles"),
        Song(name: "The One And Only", artist: "Chesney Hawkes"),
        Song(name: "Never Gonna Give You Up", artist: "Rick Astley")
    ]
    
    var movieCount = 0
    var songCount = 0
    
    for item in library {
        if item is Movie {
            movieCount += 1
        } else if item is Song {
            songCount += 1
        }
    }
    

    ダウン鋳造


    特定のクラス型の定数または変数は、型キャスト演算子を使用してサブクラスのインスタンスを参照することができます.
    として
  • ?オプションの値
  • を返す
    として、
  • !ダウンキャストとフォースを試みます結果
  • として使用する!あなたがダウンキャストが成功すると確信しているとき、そして?あなたが確かでないとき.
    例:
    for item in library {
        if let movie = item as? Movie {
            print("Movie: \(movie.name), dir. \(movie.director)")
        } else if let song = item as? Song {
            print("Song: \(song.name), by \(song.artist)")
        }
    }
    

    任意およびanyObjectの型キャスト


    Swiftには、特殊な型を扱うための2つの特別な種類があります.

  • 関数型を含むすべての型のインスタンスを表すことができます.

  • AnyObjectはクラスクラスのインスタンスを表すことができます.
  • var things: [Any] = []
    
    things.append(0)
    things.append(0.0)
    things.append(3.14159)
    things.append("hello")
    things.append(Movie(name: "Ghostbusters", director: "Ivan Reitman"))
    
  • 任意の型は任意の型を含む任意の型の値を表します.任意の値の値が期待されるオプションの値を使用する場合、Swiftは警告を与えます.任意の値として任意の値を使用する必要がある場合は、AS演算子を使用して任意のオプションを明示的にキャストできます.
  • 例:
    let optionalNumber: Int? = 3
    things.append(optionalNumber)        // Warning
    things.append(optionalNumber as Any) // No warning
    
    型またはanyObjectだけで知られている定数または変数の特定の型を発見するには、switchステートメントの場合にisまたはas patternを使用できます.
    例:
    for thing in things {
        switch thing {
        case 0 as Int:
            print("zero as an Int")
        case 0 as Double:
            print("zero as a Double")
        case let someInt as Int:
            print("an integer value of \(someInt)")
        case let someDouble as Double where someDouble > 0:
            print("a positive double value of \(someDouble)")
        case is Double:
            print("some other double value that I don't want to print")
        case let someString as String:
            print("a string value of \"\(someString)\"")
        case let (x, y) as (Double, Double):
            print("an (x, y) point at \(x), \(y)")
        case let movie as Movie:
            print("a movie called \(movie.name), dir. \(movie.director)")
        case let stringConverter as (String) -> String:
            print(stringConverter("Michael"))
        default:
            print("something else")
        }
    }