import UIKit
// 12. 상속
class Vehicle {
var currentSpeed = 0.0 // var 앞에 final 을 붙이면 override 불가=
var description: String {
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise(){
print("speaker on")
}
}
class Bicycle: Vehicle {
var hasBasket = false
}
// 여기서 Vehicle은 슈퍼클래스, Bicycle은 서브클래스 라고 함
var bicycle = Bicycle()
bicycle.currentSpeed // 0
bicycle.currentSpeed = 15
bicycle.currentSpeed // 15
// override
// a. 함수
class Train: Vehicle {
override func makeNoise(){
super.makeNoise() // 슈퍼클래스에 정의된 함수가 먼저 실행
print("choo choo")
}
}
let train = Train()
train.makeNoise()
// b. property
class Car: Vehicle {
var gear = 1
override var description: String {
return super.description + " in gear \(gear)"
}
}
let car = Car()
car.currentSpeed = 30.0
car.gear = 2
print(car.description)
class AutomaticCar: Car {
override var currentSpeed: Double {
didSet { // currentSpeed 가 바뀌고 나서 실행
gear = Int(currentSpeed / 10) + 1
}
}
}
let automatic = AutomaticCar()
automatic.currentSpeed = 35.0
print("AutomaticCar: \(automatic.description)")
/*
13. 타입 캐스팅
인스턴스의 타입을 확인하거나 어떠한 클래스의 인스턴스를
해당 클래스 계층 구조의 슈퍼 클래스나 서브 클래스로 취급하는 방법
*/
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: "기생충", director: "봉준호"),
Song(name: "Butter", artist: "BTS"),
Movie(name: "올드보이", director: "박찬욱"),
Song(name: "Wonderwall", artist:"Oasis"),
Song(name: "Rain", artist: "이적"),
]
var movieCount = 0
var songCount = 0
for item in library {
if item is Movie {
movieCount += 1
} else if item is Song {
songCount += 1
}
}
print("MovieCount: \(movieCount), SongCount: \(songCount)")
// 다운 캐스팅: as
for item in library {
if let movie = item as? Movie { // as! 는 완벽하게 일치할 때만 사용하자, as?는 옵셔널
print("Movie \(movie.name), dir. \(movie.director)")
} else if let song = item as? Song {
print("Song \(song.name), by \(song.artist)")
}
}
/*
14. assert 와 guard
assert
- 특정 조건을 체크하고, 조건이 성립되지 않으면 메세지를 출력하게 할 수 있는 함수
- assert 함수는 디버깅 모드에서만 작동
guard
- 뭔가를 검사하여 그 다음에 오는 코드를 실행할지 말지 결정하는 것
- guard 문에 주어진 조건이 "거짓" 일 때 구문이 실행 됨
*/
var value = 0
assert(value == 0) // 통과
value = 2
//assert(value == 0, "값이 0이 아닙니다.") // 값이 0이 아닙니다 라는 error 메세지 출력
func guardTest(value: Int){
guard value == 0 else { return }
print("안녕하세요")
}
guardTest(value: 2) // return
guardTest(value: 0) // 안녕하세요
// 옵셔널 바인딩
func guardTest2(value: Int?){
guard let value = value else { return }
print("value: \(value)")
}
guardTest2(value: 2) // 2
guardTest2(value: nil)
반응형
'ios > swift' 카테고리의 다른 글
[swift] 기본문법(7) (0) | 2021.11.09 |
---|---|
[swift] 기본문법(6) (0) | 2021.11.09 |
[swift] 기본문법(4) (0) | 2021.11.07 |
[swift] 기본문법(3) (0) | 2021.11.06 |
[swift] 기본문법(2) (0) | 2021.11.06 |