struct professor: {
let name: String
let lecturename : String
let studentCount : Int
}
Stored Property- 저렇게 스트럭쳐가 담고있는 데이터를 프로퍼티 라고한다.
Computed Property - 어떠한 값을 직접 저장하지는 않고 저장된 정보를 이용해서 가공 혹은 계산된 값을 사용할때에
쓰게 됩니다, 스트럭쳐 안에 함수가 있을 경우
Type property - 생성된 인스턴스에 상관없이 그 스트럭트의 타입자체의 속성을 정하고 싶을때 사용하는 것.
Property의 종류
1. Stored Property
객체가 담고 있는 데이터를 Stored property라고 한다.
Property Observer
willSet, didSet을 활용하여 데이터가 바뀌는 것을 확인 할수 있다
변수 또는 상수로 선언됩니다.
변수, 상수 값을 인스턴스의 일부로 저장합니다.
클래스와 구조체 에서만 사용됩니다
struct Person {
var firstName: String {
willSet {
print("willSet: \(firstName) --> \(newValue)")
}
didSet {
// didSet은 변수가 바뀔경우 어떻게 바뀌어가는지를 출력할수있는 기능이다. Store Property에서만 사용가능하다
// 값이 세팅되고나서 확인 didSet, 값이 세팅되기 직전에 확인 willSet
print("didSet: \(oldValue) --> \(firstName)")
}
}
//-------- Store Property
var lastName: String
2. Computed Property
객체의 정의 안에서 Stored Property가 가지고 있는 데이터를 이용 또는 가공해서 계산된 값을 사용하게 할수있다.
클래스, 구조체, 열거형에 사용됩니다
항상 변수로 선언됩니다.
getter, setter = 연산 프로퍼티 ( 값을 검색하고 세팅하는 데에 이용됩니다)
getter와 setter을 사용하려면 변수 값을 담을 변수를 반드시 지정해 주어야한다. ( 연산된 값을 담을 변수가 필요하기 때문), 자기 자신을 호출하거나 값을 지정할수 없다
호출 될 때마다 값을 재계산 하게된다
get하나 만을 가질수는 있지만 , set하나만을 가질수는 없다
get 만 있다면 Read Only Computed Property (읽기전용)
set의 (parameter)를 생략하면 newValue로 써주어야한다.
var fullName: String {
// computed store는 var로만 쓸수있다.
// computed store는 실제로 값을 저장하는 용도가 아닌 읽기 전용으로
//쓰이지만 이렇게 get set을 활용하여 읽기 쓰기 기능을 사용할수 있다.
get { // get은 read only!
return "\(firstName) \(lastName)"
}
set { // set은 새로 쓰기가능!!
if let firstName = newValue.components(separatedBy: " ").first {
self.firstName = firstName
}
// 위 코드를 설명하자면 새로운 newValue가 설정되었을때 " "를 기준으로 문자열을
//나누고 나눈 문자열의 첫번째가 firstName이 된다고 하는것이다.
//마찬가지로 아래코드 역시 마지막이 lastName이 된다고 하는 것.
if let lastName = newValue.components(separatedBy: " ").last {
self.lastName = lastName
}
}
}
}
3. Type Property
Property를 타입자체에 연결할수있다.
Type Property에는 저장 타입프로퍼티, 연산 타입프로퍼티가 있습니다
저장 타입프로퍼티는 변수 또는 상수로 선언되며 기본값을 지정해 주어야합니다
연산 프로퍼티는 변수로만 선언되어야 한다.
enum[열거형]에서 사용될수 있습니다
struct SomeStructure {
static var storedTypeProperty = "Some value."
// 기본값을 선언해준 형태
// 저장 타입프로퍼티
static var computedTypeProperty: Int {
return 1
}
// 연산 타입프로퍼티
// 읽기전용 ( get(생략됨))
//var로만 선언
}
4. Lazy Property
엔지니어링 측면에서 Optimizing 하기 위해서 사용
값이 사용되지 않으면 읽히지 않는다
항상 변수로 선언하여야 합니다
잘 사용하면 성능과 공간낭비를 줄일수 있습니다
변수가 레이지 프로퍼티로 선언되었다면 이 변수가 실행될때 코드가 읽혀집니다
여러 스레드가 프로퍼티가 초기화되지 않은 상태에서 액세스 하려고 하면 초기화를 한번만 한다고 보장할수 없습니다
기본적으로 프로퍼티는 함수가 선언되었을때 읽히게 되는데 레이지 프로퍼티는 레이지 키워드가 호출이 되어야 읽히게 된다.