[Swift๐ฆฉ] #10 ํ๋กํผํฐ
- struct, class, enum ์์ ์ ์ธํ ์ ์๊ณ , ๋์ฒด๋ก ํน์ ํ์ ์ ์ธ์คํด์ค์ด๋ค.
- ๊ทธ ์ค ์ ์ฅ ํ๋กํผํฐ๋ struct, class ์์๋ง ์ ์ธํ ์ ์๋ค.
- ํ๋กํผํฐ ๊ด์ฐฐ์๋ฅผ ํตํด ๊ฐ์ด ๋ณ๊ฒฝ๋๋ ๊ฒ์ ๋ชจ๋ํฐ๋งํ๊ณ , ํน์ ๋์์ ์ํํ๊ฒ ํ ์ ์๋ค.
1. Stored Property โญ๏ธ
์ ์ฅ๋ ์์, ๋ณ์.
struct FixedLengthRange {
var firstValue: Int
let length: Int
}
var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3) // 0, 1, 2
rangeOfThreeItems.firstValue = 6 // 6, 7, 8
let rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3) // 0, 1, 2
rangeOfThreeItems.firstValue = 6 // let ์ผ๋ก ์ ์ธํ๊ธฐ ๋๋ฌธ์ ๋ถ๊ฐ๋ฅ.
// ํ์ง๋ง class ๋ผ๋ฉด? ๊ฐ๋ฅ.
// rangeOfThreeItems = FixedLengthRange(firstRange: 1, elength: 4) ์ฒ๋ผ
// ์์ ์๋ก์ด ๋ณ์๋ฅผ ํ ๋นํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅ.
lazy
์ฌ์ฉ๋๊ธฐ ์ ๊น์ง ์ด๊ธฐ๊ฐ์ด ๊ณ์ฐ๋์ง ์๋ ํ๋กํผํฐ.
์ด๊ธฐํ ์๋ฃ ํ์๋ ์ด๊ธฐ๊ฐ์ด ์์ ์ ์๊ธฐ ๋๋ฌธ์ var ๋ก ์ ์ธํด์ผ ํ๋ค. let ์ผ๋ก ์ ์ธํ๋ ๊ฒฝ์ฐ๋ ์ด๊ธฐํ ์ ์ ๊ฐ์ ๊ฐ์ง๊ณ ์์ด์ผ ํด์ lazy ๊ฐ ๋ถ๊ฐ๋ฅ.
lazy var tableView: UITableView = {
let v = UITableView()
v.register(UITableViewCell.self, reuseIdentifier: "cell")
v.delegate = self
v.dataSource = self
return v
}()
2. Computed Property โญ๏ธโญ๏ธ
๊ฐ์ ์ค์ง์ ์ผ๋ก ์ ์ฅํ์ง ์๊ณ , ๋ค๋ฅธ ํ๋กํผํฐ์ ๊ฐ์ ๊ฐ์ ์ ์ผ๋ก ๊ฐ์ ธ์์ ์ค์ . getter, setter
let start = 0
var end = 10
var mid {
get { return (start + end) / 2 }
// set(newMid) { end = 2 * newMid }
set { end = 2 * newValue } // ์๋ ์ ๊ณต.
}
var readOnlyMid {
return (start + end) / 2
}
3. Property Observer โญ๏ธโญ๏ธ
ํ๋กํผํฐ์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋์ง ๊ด์ฐฐํ๊ณ ์๋ตํ๋ค.
์๋ก์ด ๊ฐ๊ณผ ํ์ฌ ๊ฐ์ด ๊ฐ์๋ ํ๋กํผํฐ์ ๊ฐ์ด ์ค์ ๋ ๋ ํธ์ถ๋๋ค.
- ์ ์ํ ์ ์ฅ ํ๋กํผํฐ
- ์์๋ ์ ์ฅ ํ๋กํผํฐ
- ์์๋ ๊ณ์ฐ ํ๋กํผํฐ
์์ ์ถ๊ฐํ ์ ์๋ค. (์ ์ญ ๋ณ์์ ์ ์ํ ๊ณ์ฐ ํ๋กํผํฐ์์๋ ๋ถ๊ฐ๋ฅ)
- willSet : ๊ฐ ์ ์ฅ ์ง์ ์ ํธ์ถ. (newValue๋ก ์ ์ฅ๋ ๊ฐ ์ฌ์ฉ ๊ฐ๋ฅ)
- didSet : ์๋ก์ด ๊ฐ์ด ์ ์ฅ๋์๋ง์ ํธ์ถ. (oldValue ๋ก ๋ฐฉ๊ธ ์ ์ฅ๋ ๊ฐ ์ฌ์ฉ ๊ฐ๋ฅ)
์ฃผ์ : ์ฌ๊ธฐ์ ์๊ธฐ ์์ ์ ๋ค์ set ํด๋ฒ๋ฆฌ๋ฉด?? ๋ฌดํ ๋ฃจํ๊ฐ ๋ ์ ์์.
class StepCounter {
var totalSteps: Int = 0 {
willSet(newTotalSteps) {
print("About to set totalSteps to \(newTotalSteps)")
}
didSet {
if totalSteps > oldValue {
print("Added \(totalSteps - oldValue) steps")
}
}
}
}
+) inout ํจ์์ willSet, didSet ์ด ์ ์ธ๋ ํ๋กํผํฐ๋ฅผ ์ธ์๋ก ๋๊ฒผ์ ๋, ํญ์ ๊ฐ์ด ์๋ก ๋ฎ์ด์ฐ๊ธฐ๋๋ฏ๋ก ํด๋น ํจ์๊ฐ ๋๋๋ ์์ ์ willSet didSet ์ด ๋ชจ๋ ํธ์ถ๋๋ค.
4. Property Wrapper โ
๊ฐ์ด ์ค์ ๋ก ์ ์ฅ๋์ด ์๋ ํ๋กํผํฐ, ๊ฐ์ ๊ด๋ฆฌํ๋ ํ๋กํผํฐ๋ฅผ ๋ถ๋ฆฌํ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ค. ๋ก์ง์ด ์์ฃผ ์ฐ์ด๊ณ ์ฌ์ฌ์ฉ์ฑ์ด ์๋ค๋ฉด ์ด๋ ๊ฒ ๊ด๋ฆฌํด์ฃผ์.
- ๊ตฌ์กฐ์ฒด์ @propertyWrapper ํค์๋๋ฅผ ๋ถ์ฌ์ ์ ์ํ๊ณ ,
- ์ฌ์ฉํ ๊ณณ์์
@๊ตฌ์กฐ์ฒด์ด๋ฆ
ํค์๋๋ฅผ ๋ถ์ฌ์ ์ฌ์ฉํ๋ค.
@propertyWrapper
struct TwelveOrLess {
private var number = 0
// number ์ ์ง์ ์ ๊ทผ X, wrappedValue ๋ฅผ ํตํ ์ ๊ทผ๋ง ๊ฐ๋ฅ.
var wrappedValue: Int {
get { return number }
set { number = min(newValue, 12) }
}
}
struct SmallRectangle {
// ๊ฐ๋ก ์ธ๋ก๊ฐ ๋ชจ๋ 12 ์ดํ์ธ์ง ํ์ธ.
@TwelveOrLess var height: Int
@TwelveOrLess var width: Int
}
// ๊ฐ์ ์ญํ ์ ํ๋ ์ฝ๋์ด์ง๋ง wrapping ์ ์ด๋ ๊ฒ ํ ์๋ ์์.
struct SmallRectangle {
private var _height = TwelveOrLess()
private var _width = TwelveOrLess()
var height: Int {
get { return _height.wrappedValue }
set { _height.wrappedValue = newValue }
}
var width: Int {
get { return _width.wrappedValue }
set { _width.wrappedValue = newValue }
}
}
init for property wrapping
property wrapping ์ ์ฌ์ฉํ ์ฝ๋์์ ์ด๊ธฐ์๋ฅผ ์ ์ํ๊ณ , ์ฌ์ฉํ ์ ์๋ค.
@propertyWrapper
struct SmallNumber {
private var maximum: Int
private var number: Int
var wrappedValue: Int {
get { return number }
set { number = min(newValue, maximum) }
}
init() {
maximum = 12
number = 0
}
init(wrappedValue: Int) {
maximum = 12
number = min(wrappedValue, maximum)
}
init(wrappedValue: Int, maximum: Int) {
self.maximum = maximum
number = min(wrappedValue, maximum)
}
}
struct ZeroRectangle {
@SmallNumber var height: Int // init ์ฌ์ฉ
@SmallNumber var width: Int = 1 // init(wrappedValue: ) ์ฌ์ฉ
// init(wrappedValue: maximum: ) ์ฌ์ฉ
@SmallNumber(wrappedValue: 3, maximum: 10) var height2: Int
@SmallNumber(maximum: 9) var width2: Int = 2
}
var zeroRectangle = ZeroRectangle()
print(zeroRectangle.height, zeroRectangle.width)
// Prints "0 0"
๊ฐ ํฌ์
์ ์ฅํ ๊ฐ์ ๋ณํ๋ฅผ ํ์ํ ๊ฐ์ผ๋ก ํฌ์ํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
@propertyWrapper
struct SmallNumber {
private var number: Int
private(set) var projectedValue: Bool
// number ๊ฐ ํฐ ๊ฐ์ธ์ง์ ๋ํ Bool ๊ฐ์ผ๋ก number ๋ฅผ ํฌ์.
var wrappedValue: Int {
get { return number }
set {
if newValue > 12 {
number = 12
projectedValue = true
} else {
number = newValue
projectedValue = false
}
}
}
init() {
self.number = 0
self.projectedValue = false
}
}
struct SomeStructure {
@SmallNumber var someNumber: Int
}
var someStructure = SomeStructure()
// $๋ณ์๋ช
์ผ๋ก ํฌ์๋ ๋ณ์ ๊ฐ์ ์ ๊ทผํ ์ ์๋ค.
someStructure.someNumber = 4
print(someStructure.$someNumber)
// Prints "false"
someStructure.someNumber = 55
print(someStructure.$someNumber)
// Prints "true"
-> ๊ทผ๋ฐ ๊ฒฐ๊ตญ wrappedValue ์ ์ ๊ทผํ๋ ๊ฒ์ผ ํ
๋ฐ projectedValue ์๋ ์ด๋ป๊ฒ ์ ๊ทผํ๋๊ฑฐ์ง..?? ๋ผ๊ณ ์๊ฐํ๋๋ฐ, wrappedValue, projectedValue
๋ผ๋ ํค์๋ ์์ฒด๊ฐ ํ๋กํผํฐ ๋ํ์์ ์ ๊ณต๋๋ ๊ฒ.
-> presenter ์์ ์ธ๋ถ์์๋ subject ๋ฅผ asObservable, asObserver ๋ค๋ฃจ๊ฒ ํ๋๋ฐ, ๋ง์ด ๊ฒน์น๋ฏ๋ก ์ด ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด ์ข์๋ฏ.
5. ์ ์ญ, ์ง์ญ
- ์ ์ญ : ํจ์, ๋ฉ์๋, ํด๋ก์ , ๋๋ ํ์ ์ปจํ ์คํธ ์ธ๋ถ์ ์ ์๋ ๋ณ์
- ์ง์ญ : ํจ์, ๋ฉ์๋, ํด๋ก์ , ๋๋ ํ์ ์ปจํ ์คํธ ๋ด๋ถ์ ์ ์๋ ๋ณ์
์ ์ญ ์์, ๋ณ์๋ ํญ์ lazy ๋ก ๊ณ์ฐ๋๋ค.
6. Type Property โญ๏ธ
์ธ์คํด์ค๋ง๋ค ์์ฑ๋๋ ํ๋กํผํฐ์ ๋ค๋ฅด๊ฒ, ํ์
ํ๋์ ์์ฑ๋๋ ํ๋กํผํฐ.
๊ธฐ๋ณธ๊ฐ์ ํญ์ ์ค์ผํ๊ณ , ๊ธฐ๋ณธ์ ์ผ๋ก lazy ๋ก ๋์ํ๋ค.
์ ์ฅ / ๊ณ์ฐ ํ๋กํผํฐ๋ก ๋ชจ๋ ์ ์ ๊ฐ๋ฅ
์ ์ํ๋ ๋ฌธ์ฅ ์์ static ํค์๋๋ฅผ ๋ถ์ฌ์ ์ฌ์ฉํ๋ค.
struct UserInfo {
static var uuid: String {
return UUID().uuidString
}
static var name: String = "์ด๊ธฐ๊ฐ"
}
print(UserInfo.uuid)
+) struct ๋ณด๋ค๋ enum ์์ ๋ง์ด ์ฌ์ฉํ๋ค. ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ง ์๊ณ ์ฌ์ฉํ๋ ค๊ณ . enum ์ ์ด๊ธฐ์๊ฐ ์์ผ๋๊น!!
์ง๋ฌธ
property wrapper์ ๋ํด์ ์ค๋ช ํ์์ค.
- property ์ ์ธ, ์ฌ์ฉ์ ๋ฐ๋ก ๊ตฌ๋ถํ๊ธฐ ์ํ ๋ฌธ๋ฒ์ด๋ค.
- private ์ผ๋ก ์ค์ ๊ฐ์ ์ ์ฅํ ๋ณ์๋ฅผ ์ ์ธํ๊ณ ,
- wrappedValue ์ getter, setter ๋ฅผ ์ด์ฉํด์ ๋ณ์์ ๊ฐ์ ๊ฐ์ ธ์ค๊ณ ์ค์ ํ๋ค.
- projectedValue ๋ฅผ ์ฌ์ฉํด์ ๋ณ์์ ๊ด๋ จ๋ ๊ฐ์ ํฌ์ํด์ ๊ฐ์ ธ๋ค ์ธ ์ ์๋ค.
- ์์ฃผ ์ฌ์ฉํ๋ ํจํด์ ์ ์ฉํด๋ณด๋ ๊ฒ์ด ์ข๋ค.
์ฐธ๊ณ
https://bbiguduk.gitbook.io/swift/language-guide-1/properties
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ([Swift๐ฆฉ] #10 ํ๋กํผํฐ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@ddosang/Swift-10-ํ๋กํผํฐ์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค