09.類型推論
タイプ鋳造
インスタンスのタイプを決定するか、クラスのインスタンスをクラス階層のスーパークラスまたはサブクラスと見なします.
is演算子によるタイプ推定
MediaItem
クラスとMovie
クラスがあります.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)
}
}
このとき、この2つのクラスについて、Song
文においてfor ... in
演算子により各クラスのタイプを推定することができる.let library = [
Movie(name: "기생충", director: "봉준호"),
Song(name: "Butter", artist: "BTS"),
Movie(name: "올드보이", director: "박찬욱"),
Song(name: "Wonderwall", artist: "Oasis"),
Song(name: "Next Level", artist: "aespa")
]
var movieCount = 0
var songCount = 0
for item in library {
if item is Movie {
movieCount += 1
} else if item is Song {
songCount += 1
}
}
print("Media library contains \(movieCount) movies and \(songCount) songs")
// "Media library contains 2 movies and 3 songs"
as? あるいはas!演算子によるタイプ推定
それだけでなく、条件文はサブクラスのインスタンスを参照することもできます.
is
演算子はoptionalを返し、as?
演算子は強制キャンセルパッケージタイプの値を返します.このタイプの推論が成功すれば,クラスのpropertyを使用することができる.for item in library {
if let movie = item as? Movie {
print("Movie: \(movie.name), dir. \(movie.director)")
} else if let song = item as? Song {
pring("Song: \(song.name), by \(song.artist)")
}
}
// Movie: 기생충, dir. 봉준호
// Song: Butter, by BTS
// Movie: 올드보이, dir. 박찬욱
// Song: Wonderwall, by Oasis
// Song: Next Level, by aespa
Reference
この問題について(09.類型推論), 我々は、より多くの情報をここで見つけました https://velog.io/@lattepapa/09.-타입추론テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol