스위프트 - 타입 캐스팅
유형이 프로토콜을 준수하는지 여부를 확인하는 데에도 사용할 수 있습니다.
검사 유형
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!)를 사용하여 하위 클래스의 인스턴스를 참조할 수 있습니다.
로 사용! 다운캐스트가 성공할 것이라고 확신할 때 그리고 어떻게? 확실하지 않을 때.
예시 :
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"))
예시 :
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")
}
}
Reference
이 문제에 관하여(스위프트 - 타입 캐스팅), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/naveenragul/swift-type-casting-4ifn텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)