프로퍼티 : 클래스, 구조체 또는 열거형등에 소속된 값
저장프로퍼티 : 인스턴스의 변수나 상수
- #1 구조체는 값타입이기 때문에 상수로 선언하면 변수로 선언된 프로퍼티라고 해도 값이 변경되지 않는다
- #2 클래스는 참조타입이기 때문에 상수로 선언해도 프로퍼티의 값을 변경할 수 있다. 물론 상수 프로퍼티는 변경 불가.
//저장프로퍼티
//구조체 선언
struct Dog{
var name: String
let gender: String
}
//구조체 사용
var dog = Dog(name: "dak", gender: "Male")
dog.name = "buk"
//dog.gender = "female" // Error 상수는 초기화 불가능
//출력
print(dog)
//#1 상수 구조체
let dog2 = Dog(name: "jal", gender: "male")
//dog2.name = "jak" //Error 상수 구조체의 프로퍼티 초기화 불가능
//클래스 선언
class Cat{
var name: String
let gender: String
init(name: String, gender: String){
self.name = name
self.gender = gender
}
}
//#2 상수 클래스
let cat = Cat(name: "kat", gender: "male")
cat.name = "hak"
cat.name //"hak"
연산프로퍼티 : 특정연산을 실행한 결과값
- set 을 사용하지 않고 get 만 선언해도 작동한다
- set의 매개변수 이름을 설정하지 않으면 newValue 로 디폴트값이 설정된다 set { newValue... }
import UIKit
//연산프로퍼티
//구조체 선언
struct Stock{
var averagePrice: Int
var quanity: Int
//연산프로퍼티 선언
var purchasePrice: Int{
get{
return averagePrice * quanity
}
set(newPrice){
averagePrice = newPrice / quanity
}
}
}
//구조체 생성
var stock = Stock(averagePrice: 2300, quanity: 3)
//값 확인
print(stock) //"Stock(averagePrice: 2300, quanity: 3)\n"
//get에 접근
stock.purchasePrice //6900
//set에 접근
stock.purchasePrice = 3000
//set 활성화로 변경된 averagePrice
stock.averagePrice //1000
-------------------------------
Stock(averagePrice: 2300, quanity: 3)
프로퍼티옵저버 : 프로퍼티값의 변화를 관찰하고 반영, 새로운값이 기존값이 같더라도 호출
- 저장프로퍼티, 오버라이딩이 된 저장프로퍼티, 오버라이딩이 된 계산프로퍼티에서만 사용가능
- wilSet 옵저버:
- 값이 저장되기 직전에 호출
- 새로 저장될 프로퍼티의 값을 상수 매개변수로 전달
- 매개변수이름 기본값: newValue
- didSet 옵저버:
- 값이 저장된 후에 호출
- 프로퍼티의 기존값이 상수 매개변수로 전달
- 매개변수이름 기본값: oldValue
//프로퍼티옵저버
//클래스 선언
class Account {
var credit: Int = 0{
//소괄호 이름 지정
willSet {
print("잔액이 \(credit)원에서 \(newValue)원으로 변경될 예정입니다.")
}
didSet {
print("잔액이 \(oldValue)원에서 \(credit)원으로 변경되었습니다.")
}
}
}
//클래스 생성
var account = Account()
account.credit = 1000
------------------------------
잔액이 0원에서 1000원으로 변경될 예정입니다.
잔액이 0원에서 1000원으로 변경되었습니다.
타입프로퍼티
- 특정 타입에서 사용되는 프로퍼티
- 인스턴스 생성 없이 객체 내의 프로퍼티에 접근 할 수 록 있게 함
- static 키워드를 사용하여 정의
//타입프로퍼티
//구조체 선언
struct SomeStructure {
static var storedTypeProperty = "Some value." //스토어
static var computedTypeProperty: Int { //컴퓨티드
return 1
}
}
//값 확인
SomeStructure.computedTypeProperty // 1
SomeStructure.storedTypeProperty //"Some value."
//프로퍼티 생성 없이 값 변환
SomeStructure.storedTypeProperty = "hello"
SomeStructure.storedTypeProperty //"hello"
End