Swift Property / Instance Method
in Study on Swift, Mobile Dev.
swift 에서의 struct 또는 class 에서는 member variable 을 property 라고 한다. 이 Property 들은 상태를 체크 할수 있는 기능을 가지고 있다. 천천히 알아보자.
- Store Property: member variable 결국, 상수 또는 변수를 저장한다고 보면된다. 이부분은 init() 에 instantiate 할때 설정을 해줘야한다.
- Type Property: static variable 이다. 객채가 가지고 있는 변수라고 생각하면 된다. 여러가지의 Instantiate 을 해도 공유 되는 값이다.
- Compute Property: 동적으로 계산하기 때문에, var 만 가능하며, getter / setter 를 만들어줄수있다. getter 는 필수 이며, setter 는 구현 필요없다. (즉 setter 가 없다면, 굳이 getter 를 사용할 필요 없다.)
- Property Observer: 이건 Property 들의 상태들을 체크를 할 수 있다. 상속받은 저장/연산 Proprty 체크가 가능하며,
willSet
과didSet
으로 이루어져있다.willSet
같은 경우, 값이 변경되기 전에 호출이되고,didSet
은 값이 변경 이후에 호출한다. 접근은 newValue 와 oldValue 로 체크할수 있다. - Lazy Stored Property: 이 부분은
lazy
라는 Keyword 로 작성이되며, 값이 사용된 이후에 저장이 되므로, 어느정도의 메모리 효율을 높일수 있다.
import Foundation
struct AppleDevice {
var modelName: String
let releaseYear: Int
lazy var care: String = "AppleCare+"
/// Property Observer
var owner: String {
willSet {
print("New Owner will be changed to \(newValue)")
}
didSet {
print("Changed to \(oldValue) -> \(owner)")
}
}
/// Type Property
static let companyName = "Apple"
/// Compute Property
var isNew: Bool {
releaseYear >= 2020 ? true : false
}
}
var appDevice = AppleDevice(modelName: "AppleDevice", releaseYear: 2019, owner: "John")
print(appDevice.care)
appDevice.owner = "Park"
Instance Method 도 마찬가지이다. 위의 코드에 method 를 넣어보자. struct 일 경우에는 저장 property 를 method 에서 변경하려면, mutating
keyword 가 필요하다. 그리고 다른건 static 함수이다. 이 부분에 대해서는 따로 설명하지 않겠다.
import Foundation
struct AppleDevice {
var modelName: String
let releaseYear: Int
lazy var care: String = "AppleCare+"
var price: Int
/// Property Observer
var owner: String {
willSet {
print("New Owner will be changed to \(newValue)")
}
didSet {
print("Changed to \(oldValue) -> \(owner)")
}
}
/// Type Property
static let companyName = "Apple"
/// Compute Property
var isNew: Bool {
releaseYear >= 2020 ? true : false
}
mutating func sellDevice(_ newOwner: String, _ price: Int) -> Void {
self.owner = newOwner
self.price = price
}
static func printCompanyName() {
print(companyName)
}
}
var appDevice = AppleDevice(modelName: "AppleDevice", releaseYear: 2019, price: 500, owner: "John")
print(appDevice.care)
appDevice.owner = "Park"
AppleDevice.printCompanyName()