๊ฐ๋จํ๊ฒ property๋ member ๋ณ์์ด๋ค. ๊ทธ๋ฐ๋ฐ Swift์๋ ๋ค์ํ ์ข ๋ฅ์ property๊ฐ ์กด์ฌํ๋ค. ์ฌ์ค ์ด๋ป๊ฒ ๋ณด๋ฉด ํ์ฉ๋ฐฉ๋ฒ? ํ ํฌ๋์ ๊ฐ๊น๊ฒ ๋ค. ์ด๋ป๊ฒ property๋ฅผ ๊ด๋ฆฌํ๋ ์ง ์๋ค๋ฉด, ์ค์ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ณ ์ฝ๊ธฐ ์ข๊ฒ ์ ์งํ ์ ์๋ค. ๊ทธ๋ผ ์ถ๋ฐํด๋ณด์.
Property์ ์ข ๋ฅ
- ์ญํ ์ ๋ฐ๋ฅธ ๋ถ๋ฅ
- ์ธ์คํด์ค ํ๋กํผํฐ
- ํ์ ํ๋กํผํฐ
- ์ข
๋ฅ
- ์ ์ฅ ํ๋กํผํฐ
- ์ฐ์ฐ ํ๋กํผํฐ
var
๋ก๋ง ์ ์ธ ๊ฐ๋ฅ- ์ฝ๊ธฐ ์ ์ฉ ๊ตฌํ์ ๊ฐ๋ฅ -
get
๋ธ๋ก์ ์์ฑ - ์ฐ๊ธฐ ์ ์ฉ ๊ตฌํ์ ๋ถ๊ฐ๋ฅ
์์ 4๊ฐ์ง๊ฐ ์์ฌ์ ์กด์ฌํ ์ ์๋ค. ์ฆ 4๊ฐ์ง์ ๊ฐ๋ฅ์ฑ์ด ์กด์ฌ.
- ์ธ์คํด์ค ์ ์ฅ ํ๋กํผํฐ
- ํ์ ์ ์ฅ ํ๋กํผํฐ
- ์ธ์คํด์ค ์ฐ์ฐ ํ๋กํผํฐ
- ํ์ ์ฐ์ฐ ํ๋กํผํฐ
Property์ ํน์ง
- ๊ตฌ์กฐ์ฒด, ํด๋์ค, ์ด๊ฑฐํ ๋ด๋ถ์ ๊ตฌํ์ด ๊ฐ๋ฅ
- ์ด๊ฑฐํ์๋ ์ฐ์ฐ ํ๋กํผํฐ๋ง ๊ตฌํ ๊ฐ๋ฅ
- ์ฝ๊ธฐ ์ฐ๊ธฐ ๋ชจ๋๊ฐ๋ฅํ๊ฒ ํ๋ ค๋ฉด
get
๋ธ๋ญ๊ณผset
๋ธ๋ญ ๋ชจ๋ ๊ตฌํ- ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๋ง๋ค๊ณ ์ถ์ผ๋ฉด
get
๋ง ๊ตฌํ
- ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๋ง๋ค๊ณ ์ถ์ผ๋ฉด
set
์์ ์์์ ๋งค๊ฐ๋ณ์ newValue๋ฅผ ์ฌ์ฉํ ์ ์์
struct Student {
// ์ธ์คํด์ค ์ ์ฅ ํ๋กํผํฐ
var name: String = ""
var `class`: String = "Swift"
var koreanAge: Int = 0
// ์ธ์คํด์ค ์ฐ์ฐ ํ๋กํผํฐ
var westernAge: Int {
get {
return koreanAge - 1
}
set(inputValue) {
koreanAge = inputValue + 1
}
}
// ํ์
์ ์ฅ ํ๋กํผํฐ
static var typeDescription: String = "ํ์"
// ์ฝ๊ธฐ ์ ์ฉ ํ์
์ฐ์ฐ ํ๋กํผํฐ
// ์ฝ๊ธฐ ์ ์ฉ์ด default๋ผ ์ ์ง ์์ผ๋ฉด ์ฝ๊ธฐ์ ์ฉ์ด๋ผ๊ณ ํ๋จํจ
static var selfintroduction: String {
return "ํ์ํ์
์
๋๋ค."
}
}
- ์ธ์คํด์ค ์ ์ฅ ํ๋กํผํฐ๋ ์ผ๋ฐ์ ์ด๋ ํจ์ค
- ์ธ์คํด์ค ์ฐ์ฐ ํ๋กํผํฐ๋, ํน์ ๊ฐ์ ๋ฐ์์ ๋ค๋ฅธ ์ ์ฅ ์ธ์คํด์ค์ ๊ฐ์ ์ค์ ํด์ค์ผ ํ๋ค๊ฑฐ๋ ๋ค๋ฅธ ํ๋กํผํฐ๋ก ๋ถํฐ ์ฐ์ฐ์ ํตํด ํด๋น ํ๋กํผํฐ์ ๊ฐ์ด ๋์ถ๋ ๋ ์ฃผ๋ก ์ฌ์ฉ
- ํ์ ์ ์ฅ ํ๋กํผํฐ๋ ๊ธฐ์กด์ ์๊ณ ์๋ ํ์ ํ๋กํผํฐ
- ํ์ ์ฐ์ฐ ํ๋กํผํฐ ์ญ์ ๋น์ทํ๋ค.
- ์ด๋ฌํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ๊ธฐ์กด์ introduce์ ๊ฐ์ ํจ์๋ฅผ ์ฝ๊ธฐ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋์ฒดํ๋ ๊ฒ๋ ๊ฐ๋ฅ
// ์ธ์คํด์ค ์์ฑ
var wansik: Student = Student()
wansik.name = "wansik"
wansik.koreanAge = 20
// ์ธ์คํด์ค ์ ์ฅ ํ๋กํผํฐ ์ฌ์ฉ
print(wansik.name) // wansik
// ์ธ์คํด์ค ์ฐ์ฐ ํ๋กํผํฐ ์ฌ์ฉ
print(wansik.westernAge) // 19
// ํ์
์ ์ฅ ํ๋กํผํฐ ์ฌ์ฉ
print(Student.typeDescription) // ํ์
// ํ์
์ฐ์ฐ ํ๋กํผํฐ ์ฌ์ฉ
print(Student.selfintroduction) // "ํ์ํ์
์
๋๋ค."
Property Observers
- ํ๋กํผํฐ ๊ฐ์์๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋กํผํฐ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋, ์ํ๋ ๋์์ ์ํํ ์ ์์
- ๊ฐ์ด ๋ณ๊ฒฝ๋๊ธฐ ์ง์ ์ willSet ๋ธ๋ญ์ด, ๋ณ๊ฒฝ ์งํ didSet ๋ธ๋ญ์ด ํธ์ถ๋จ
- ๋ณ๊ฒฝ๋๋ ค๋ ๊ฐ์ด ๊ธฐ์กด ๊ฐ๊ณผ ๊ฐ๋๋ผ๋ ํญ์ ๋์
willSet
๋ธ๋ญ์์ ์์์ ๋งค๊ฐ๋ณ์newValue
๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅdidSet
๋ธ๋ญ์์๋oldValue
๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅ- ํ๋กํผํฐ ๊ฐ์์๋ ์ฐ์ฐ ํ๋กํผํฐ์์ ์ฌ์ฉ ๋ถ๊ฐ
- ํจ์, ๋ฉ์๋, ํด๋ก์ , ํ์ ๋ฑ์ ์ง์ญ/์ ์ญ ๋ณ์์ ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅ
struct Money {
// ํ๋กํผํฐ ๊ฐ์์ ์ฌ์ฉ
var currencyRate: Double = 1100 {
willSet(newRate) {
print("ํ์จ์ด \(currencyRate)์์ \(newRate)์ผ๋ก ๋ณ๊ฒฝ๋ ์์ ์
๋๋ค")
}
didSet(oldRate) {
print("ํ์จ์ด \(oldRate)์์ \(currencyRate)์ผ๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค")
}
}
// ๋งค๊ฐ ๋ณ์๋ฅผ ์์์ ์ผ๋ก newValue, oldValue๋ฅผ ๊ฐ๋๋ค.
var dollar: Double = 0 {
willSet {
print("\(dollar)๋ฌ๋ฌ์์ \(newValue)๋ฌ๋ฌ๋ก ๋ณ๊ฒฝ๋ ์์ ์
๋๋ค")
}
didSet {
print("\(oldValue)๋ฌ๋ฌ์์ \(dollar)๋ฌ๋ฌ๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค")
}
}
// ์ฐ์ฐ ํ๋กํผํฐ
var won: Double {
get {
return dollar * currencyRate
}
set {
dollar = newValue / currencyRate
}
// get, set๊ณผ ํจ๊ป ์ฌ์ฉ์ด ๋ถ๊ฐํจ
// willSet {
// print("์ํ์ ๊ฐ์ด \(won)์ผ๋ก ๋ณ๊ฒฝ๋ ์์ ์
๋๋ค.")
// }
// didSet {
// print("์ํ์ ๊ฐ์ด \(won)์ผ๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค.")
// }
}
}
var moneyInMyPocket = Money()
// ํ์จ์ด 1100.0์์ 1150.0์ผ๋ก ๋ณ๊ฒฝ๋ ์์ ์
๋๋ค
moneyInMyPocket.currencyRate = 1150.0
// ํ์จ์ด 1100.0์์ 1150.0์ผ๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค
//0.0๋ฌ๋ฌ์์ 10.0๋ฌ๋ฌ๋ก ๋ณ๊ฒฝ๋ ์์ ์
๋๋ค
moneyInMyPocket.won = 11500
//0.0๋ฌ๋ฌ์์ 10.0๋ฌ๋ฌ๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค
print(moneyInMyPocket.dollar) // 10
Property Wrappers
-
property ์ ์ฅ ๋ฐฉ๋ฒ ์ฝ๋์ property ๊ด๋ฆฌ ์ฝ๋๋ฅผ ๊ตฌ๋ถ
-
property set, getํ ๋ ๊ณตํต์ ์ผ๋ก ์ ์ฉ๋๋ ๋ฐ๋ณต์ฝ๋๋ฅผ ๊ด๋ฆฌํ ์ ์์
- ๋ฐ์ดํฐ ์ ์ฅ์ ์ค๋ ๋ ์ฒดํฌ
-
struct, enum, class ์ ์ธ ์์
@propertyWrapper
๋ฅผ ๋ถ์ด๊ณwrappedValue
์ ์ํ๋ฉด ๋จ -
ํน์ ๋ฐ์ดํฐ์ boundary๋ฅผ ์ ํ ์ ์์
@propertyWrapper struct TwelveOrLess { private var number = 0 var wrappedValue: Int { get { return number } set { number = min(newValue, 12) } } } struct SmallRectangle { @TwelveOrLess var height: Int @TwelveOrLess var width: Int }
-
Initializer๋ฅผ ํตํด value ์ด๊ธฐํ ๊ฐ๋ฅ
@propertyWrapper struct SmallNumber { private var maximum: Int private var number: Int var wrappedValue: Int { get { return number } set { number = min(newValue, maximum) } } init() { self.maximum = 12 self.number = 0 } init(maximum: Int) { self.maximum = maximum self.number = 0 } init(wrappedValue: Int, maximum: Int) { self.maximum = maximum self.number = min(wrappedValue, maximum) } } struct ZeroRectangle { @SmallNumber(wrappedValue: 5, maximum: 10) var height: Int // custom initializer๋ฅผ ์ฌ์ฉํ ์ด๊ธฐํ @SmallNumber(maximum: 10) var width: Int = 5 // ๊ฐ ํ ๋น๊ณผ custom initializer๋ฅผ ์์ด์ ์ฌ์ฉํจ }
-
Projected Value
projectValue
๋ฅผ ์ฌ์ฉํ๋ฉดwrappedValue
๋ฅผ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ๋๋ฌ๋ผ ์ ์์$
๋ฅผ ํตํด ์ ๊ทผ์ด ๊ฐ๋ฅํจ@propertyWrapper struct SmallNumber { private var number = 0 var projectedValue = false var wrappedValue: Int { get { return number } set { if newValue > 12 { number = 12 projectedValue = true } else { number = newValue projectedValue = false } } } } struct SizedRectangle { @SmallNumber var height: Int @SmallNumber var width: Int mutating func resize(to size: Size) -> Bool { switch size { case .small: height = 10 width = 20 case .large: height = 100 width = 100 } return $height || $width // True or False || True or False } }