스위프트 - 타입 캐스팅

3956 단어
타입 캐스팅은 타입의 인스턴스를 다른 슈퍼클래스나 서브클래스로 취급하고 인스턴스의 타입을 확인하는 방법으로 as 및 is 연산자로 구현됩니다.

유형이 프로토콜을 준수하는지 여부를 확인하는 데에도 사용할 수 있습니다.

검사 유형



  • is 연산자는 인스턴스가 특정 유형인지 또는 하위 클래스 유형인지 확인하는 데 사용됩니다.

  • 예시 :

    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
        }
    }
    



    다운캐스팅



    특정 클래스 유형의 상수 또는 변수는 실제로 유형 캐스트 ​​연산자(as? 또는 as!)를 사용하여 하위 클래스의 인스턴스를 참조할 수 있습니다.
  • as?, 선택적 값 반환
  • as!, 다운캐스트를 시도하고 결과를 강제로 풀기

  • 로 사용! 다운캐스트가 성공할 것이라고 확신할 때 그리고 어떻게? 확실하지 않을 때.

    예시 :

    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)")
        }
    }
    



    Any 및 AnyObject에 대한 유형 캐스팅



    Swift는 비특정 유형 작업을 위한 두 가지 특수 유형을 제공합니다.

  • Any는 함수 유형을 포함하여 모든 유형의 인스턴스를 나타낼 수 있습니다.

  • 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"))
    


  • Any 유형은 선택적 유형을 포함하여 모든 유형의 값을 나타냅니다. Swift는 Any 유형의 값이 예상되는 선택적 값을 사용하는 경우 경고를 표시합니다. 옵셔널 값을 Any 값으로 사용해야 하는 경우 as 연산자를 사용하여 옵셔널 값을 Any로 명시적으로 캐스팅할 수 있습니다.

  • 예시 :

    let optionalNumber: Int? = 3
    things.append(optionalNumber)        // Warning
    things.append(optionalNumber as Any) // No warning
    



    Any 또는 AnyObject 유형으로만 알려진 상수 또는 변수의 특정 유형을 발견하려면 is 또는 switch 문의 경우 패턴으로 사용할 수 있습니다.

    예시 :

    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")
        }
    }
    

    좋은 웹페이지 즐겨찾기