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