develop

Property(Stored Property, Lazy Property, Computed Property, Property Observers, Type Property) 본문

iOS

Property(Stored Property, Lazy Property, Computed Property, Property Observers, Type Property)

pikachu987 2021. 2. 1. 20:52
반응형

저장 프로퍼티(Stored Property)

struct Example {
    var value: String
}

 

지연 프로퍼티(Lazy Property)

struct Example {
    lazy var value: String = ""
}

let example = Example()

value에 접근하기 전까지 value는 메모리에 올라가지 않는다.

lazy는 let이 될수 없다. let으로 선언된 변수는 초기에 값이 있어야 하는데 lazy는 초기에 값이 존재하지 않고 접근시 값이 생기는 것이라 let을 사용할 수 없다.

만약 변수가 클로저로 되어서 스스로를 참조하면 캡쳐리스트로 메모리 누수를 방지 해야 한다.

class Example {
    var value = ""
    lazy var closure: () -> String = { [weak self] in
        return "Hello \(String(describing: self?.value))"
    }
}

 

연산 프로퍼티(Computed Property)

struct Example {
    var value: String
    
    var value2: String {
        return "Example: \(value)"
    }
}

value2는 연산 프로퍼티이고 return 하기전 여러가지 연산을 할수 있다.

읽기 전용으로 사용할 수 있다.

연산 프로퍼티는 lazy를 사용할 수 없다. lazy는 처음 접근시 메모리에 값을 올리고 그 이후로 메모리에 올라간 값을 사용하는데 연산 프로퍼티는 사용할 때 마다 연산하기 때문이다.

 

Set, Get

struct Example {
    var value: String
    
    var value2: String {
        get {
            return self.value
        }
        set {
            self.value = newValue
        }
    }
}

이런식으로 사용할 수도 있다.

extension UITextField {
    typealias Value = (text: String?, placeholder: String?)
    
    var value: Value {
        set {
            self.text = newValue.text
            self.placeholder = newValue.placeholder
        }
        get {
            return (text: self.text, placeholder: self.placeholder)
        }
    }
}

 

프로퍼티 감시자(Property Observers)

struct Example {
    var value: String {
        willSet {
            print(newValue)
        }
        didSet {
            print(oldValue)
        }
    }
}

willSet은 값이 변경하기 전에 호출되고 변할 값을 newValue로 볼 수 있다.

didSet은 값이 변하고 난 다음 호출되고 변경하기 전 값을 oldValue로 볼 수 있다.

 

타입 프로퍼티(Type Property)

struct Example {
    static var value: String = ""
}

 

static 대신 class을 사용할 수도 있다. 2021/01/17 - [iOS] - final Keyword 참조

 

static var나 static let은 swift3에서부터 lazy하게 동작한다.
https://docs.swift.org/swift-book/LanguageGuide/Properties.html# 참조

 

반응형

'iOS' 카테고리의 다른 글

DispatchWorkItem  (0) 2021.02.03
LazySequence  (0) 2021.02.02
KVC KVO (Key-Value Coding, Key-Value Observing)  (0) 2021.01.31
Reference Equal 참조 비교하기  (0) 2021.01.31
Struct Mutating  (0) 2021.01.30
Comments