[swift] 기본문법(5)
ios/swift

[swift] 기본문법(5)

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