프로퍼티는 클래스, 구조체, 열거형과 관련된 값. 타입과 관련된 값을 저장, 연산 가능.
프로퍼티는 구조체, 클래스, 열거형 내부에 구현 가능. 하지만 열거형 내부에는 연산 프로퍼티만 구현 가능. 연산프로퍼티는 var로만 선언 가능하고, 읽기 전용으로 구현할 수 있지만, 쓰기 전용으로는 구현 불가. 읽기 전용으로 구현하려면 get 블럭을 작성하면되는데 이 get 블럭은 생략 가능. 읽기, 쓰기 모두 가능하게 하려면 get 블럭과 set 블럭을 모두 구현 해주면 됨.
저장 프로퍼티와 연산 프로퍼티의 기능은 함수, 메서드, 클로저, 타입 등의 외부에 위치한 지역/전역 변수에도 모두 사용 가능.
///정의
struct Student {
//인스턴스 저장 프로퍼티
var name: String = ""
var `class`: String = "Swift"
var koreanAge: Int = 0
//인스턴스 연산 프로퍼티
var westernAge: Int {
get {
return koreanAge - 1
}
set(inputValue) {
koreanAge = inputVaule + 1
}
}
//타입 저장 프로퍼티
static var typeDescription: String = "학생"
/*
//인스턴스 메서드
func selfIntroduce() {
print("저는 \(self.class)반 \(name)입니다")
}
*/
//읽기 전용 인스턴스 연산 프로퍼티
var selfIntroduction: String {
get {
return "저는 \(self.class)반 \(name)입니다"
}
}
/*
//타입 메서드
static func selfIntroduce() {
print("학생 타입 입니다.")
}
*/
//읽기 전용 타입 연산 프로퍼티 (get 생략 가능)
static var selfIntroduction: String {
return "학생 타입 입니다."
}
}
///사용
//타입 연산 프로퍼티 사용
print(Student.selfIntroduction)
// 학생 타입 입니다.
//인스턴스 생성
var nylonmask: Student = Student()
nylonmask.koreanAge = 10
//인스턴스 저장 프로퍼티 사용
nylonmask.name = "nylonmask"
print(nylonmask.name)
//nylonmask
//인스턴스 연산 프로퍼티 사용
print(nylonmask.selfIntroduction)
//저는 Swift반 nylonmask입니다
print("제 한국나이는 \(nylonmask.koreanAge)살이고, 미국나이는 \(nylonmask.westernAge)살입니다.")
//제 한국 나이는 10살이고, 미국나이는 9살입니다.
///응용
struct Money {
var currencyRate: Double = 100
var dollar: Double = 0
var won: Double {
get {
return dollar + currencyRate
}
set {
dollar = newValue / currencyRate
}
}
}
var moneyInMyPocket = Money()
moneyInMyPocket.won = 11000.0
print(moneyInMyPocket.won)
//11000.0
moneyInMyPocket.dollar = 10
print(moneyInMyPocket.won)
//11000.0
//MARK: - 지역변수, 전역변수
//저장 프로퍼티와 연산 프로퍼티의 기능은 함수, 메서드, 클로저, 타입 등의 외부에 위치한 지역/전역 변수에도 모두 사용 가능
var a: Int = 100
var b: Int = 200
var sum: Int {
return a + b
}
print(sum) //300