ํฐ์คํ ๋ฆฌ ๋ทฐ

์๋ ํ์ธ์?
๋๊ตฌ๋ฆฌ์ ๋๋คใ ใ
์ค๋์ ํ๋กํผํฐ ๋ํผ์ ๋ํด์ ๊ณต๋ถํด๋ณด๋ ค๊ณ ํ๋๋ฐ์.
์์ฆ SwiftUI๋ฅผ ์ฌ์ฉํ๋ฉด์
@State๋ @Binding ๊ฐ์ ์น๊ตฌ๋ค์ ๋ง์ด ์ฌ์ฉํ๊ณ ์๋๋ฐ
์ด ์น๊ตฌ๋ค ์ด๋ฆ์ด ํ๋กํผํฐ ๋ํผ์ฌ์ ๋ด์ฉ์ ๊ณต๋ถํ๋ฉด์ ์ ๋ฆฌํด๋ณด๋ ค ํฉ๋๋ค.
๊ทธ๋ผ ๋ฐ๋ก ์์ํด๋ณผ๊ฒ์!!
ํ๋กํผํฐ ๋ํผ(Property Wrapper)๋?
ํ๋กํผํฐ ๋ํผ..
์ง๊ด์ ์ผ๋ก ๋ณด๋ฉด ํ๋กํผํฐ๋ฅผ ๊ฐ์ธ์ ์ฌ์ฉํ๋ ๋๋์ด๋ค์
(๊ฐ์ธ์ ๋ญ ํ๊ฒ ๋ค๋๊ฑฐ์ง...?)
๊ณต์๋ฌธ์์์ ๋์ค๋ ๋ด์ฉ์ ๋ณด๋ฉด
ํ๋กํผํฐ๊ฐ ์ ์ฅ๋๋ ๋ฐฉ๋ฒ์ ๊ด๋ฆฌํ๋ ์ฝ๋์ ํ๋กํผํฐ๋ฅผ ์ ์ํ๋ ์ฝ๋ ์ฌ์ด์ ๋ถ๋ฆฌ๊ณ์ธต์ ์ถ๊ฐํ๊ณ ์ด๊ฒ์ ์ฌ์ฌ์ฉํ๋ค.
๋ผ๊ณ ๋์ค๋๋ฐ
์... ๊ฐ์ด ์ ์์ค๋ค์..
์ฝ๋๋ฅผ ์ฌ์ฉํด ๋ณด๋ฉด์ ๋ ์์๋ณด๋๋ก ํ ๊ฒ์!
๋จผ์ ํ๋กํผํฐ ๋ํผ๋ฅผ ์ ์ํด๋ณผ๊ฒ์!!
ํ๋ฌํผํฐ ๋ํผ๋ฅผ ์ ์ํ๊ธฐ ์ํด์๋ wrappedValue ํ๋กํผํฐ๋ฅผ ์ ์ํ
๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ์ด๋ ํด๋์ค๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
์ ๊ทธ๋ผ ํญ์ 12์ดํ์ธ ์๋ฅผ ์ ์ฅํ๋ ํ๋กํผํฐ ๋ํผ๋ฅผ ์ ์ธํด๋ณผ๊ฒ์!
@propertyWrapper
struct TwelveOrLess {
private var number = 0
var wrappedValue: Int {
get { return number }
set { number = min(newValue, 12) }
}
}
๋จผ์ @propertyWrapper ํค์๋๋ฅผ ์ฌ์ฉํด์ ์ ์ธํ๊ณ ์ ํ๋ ๊ตฌ์กฐ์ฒด ์์ ๋ถ์ฌ์ค๋๋ค.
์ดํ์ wrappedValue ํ๋กํผํฐ๋ฅผ ์ ์ํ๊ณ ์ํ๋ ๊ธฐ๋ฅ์ ๋ฆฌํดํ๋๋ก ์ฝ๋๋ฅผ ์์ฑํด ์ฃผ๋๊ฑฐ์์!
์ด๋ number๋ฅผ private๋ก ์ ์ธํด์ ๋ด๋ถ์์๋ง ์ ๊ทผํ ์ ์๋๋ก ํด์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ ์ํ ํ๋กํผํฐ ๋ํผ๋ฅผ ์ฌ์ฉํด ๋ณผ๊ฒ์!
struct SmallRectangle {
@TwelveOrLess var height: Int
@TwelveOrLess var width: Int
}
var rectangle = SmallRectangle()
print(rectangle.height)
// Prints "0"
rectangle.height = 10
print(rectangle.height)
// Prints "10"
rectangle.height = 24
print(rectangle.height)
// Prints "12"
์์์ ๋ง๋ค์๋ ํ๋กํผํฐ ๋ํผ๋ฅผ ์ฌ์ฉํด์
์ง์ฌ๊ฐํ์ ๊ฐ๋ก ์ธ๋ก ๊ธธ์ด๋ฅผ ํ๋กํผํฐ๋ก ๊ฐ์ง๋ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ง๋ค์๋๋ฐ์.
์๋์ ์ธ์คํด์ค์ height๊ฐ์ ํ์ธํด ๋ณด๋ฉด
์ด๊ธฐ๊ฐ์ ์ถ๋ ฅํ๋ฉด ํ๋กํผํฐ ๋ํผ์ ์ด๊ธฐ๊ฐ์ด ์ถ๋ ฅ๋๊ณ ,
์ดํ์ ์ฌ๋ฌ ๊ฐ์ ์ ๋ ฅํด ์ฃผ์์ ๋
ํ๋กํผํฐ ๋ํผ์ setter์์ ์ค์ ํ ๊ฐ์ ์ถ๋ ฅํ๋ ๊ฒ์ ๋ณผ ์ ์์ด์!!
์ ๊ธฐํ๋ค์ใ ใ
ํ๋กํผํฐ์ ๋ํผ๋ฅผ ์ ์ฉํ ๋ ์ปดํ์ผ๋ฌ๊ฐ
๋ํผ๊ฐ ์ฌ์ฉํ๋ ์ ์ฅ์ ์ฝ๋์ ํ๋กํผํฐ์ ์ ๊ทผํ๋ ์ฝ๋๋ฅผ ํฉ์ฑํ๋ค๊ณ ํฉ๋๋ค.
๊ทธ๋์ ์ด๋ฐ ๊ณผ์ ์ด ๊ฐ๋ฅํ๊ฐ๋ด์!
๋ ํ๋กํผํฐ ๋ํผ๋ฅผ ์ฌ์ฉํ์ง ์๋๋ผ๋
๋๊ฐ์ด ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋๋ฐ์!
๋ฐ๋ก ํ๋กํผํฐ ๋ํผ๋ก ์ ์ธํ ๊ตฌ์กฐ์ฒด๋ฅผ ํ๋กํผํฐ๋ก ๋ง๋ค์ด์ฃผ๋๊ฑฐ์์!!
๊ทธ๋ ๊ฒ ์์ฑ๋ ์ฝ๋๋ฅผ ๋ณด์ค๊น์?
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 }
}
}
์ด๋ ๊ฒ ํ๋ฉด ์๋ ๊ธฐ๋ฅ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ํํฉ๋๋ค!!
height์ width์ get๊ณผ set์ _height์ _width์ wrappedValue์ ์ ๊ทผํ์ฌ
๊ธฐ๋ฅ์ ๊ตฌํํฉ๋๋ค.
์ ๋ ๋ญ๊ฐ ํ๋กํผํฐ ๋ํผ๋ก ๊ตฌํํ๊ฒ ๋ ๋๋ฆฌ๋ค์ใ ใ
๋, ํ๋กํผํฐ ๋ํผ๋ฅผ ๊ตฌํํ ๋ ๋ด๋ถ์ ํ๋กํผํฐ๊ฐ ์ด๊ธฐํ๊ฐ ๋์ด ์์ด์ผ ํ๊ณ
์ด ๋ถ๋ถ์ ์ธ๋ถ์์ ๋ฐ๊ฟ ์ ์๋๋ฐ์!
๋ง์ฝ์ ์ด๊ธฐ๊ฐ์ ์ธ๋ถ์์ ๋ฐ๊พธ์ด ์ฃผ๊ณ ์ถ๋ค๋ฉด
init ๋ฉ์๋๋ฅผ ํตํด ๋ฐ๊ฟ ์ ์์ผ๋ ์ฐธ๊ณ ํ์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
ํ๋กํผํฐ ๋ํผ์ ๊ฐ ํฌ์
ํ๋กํผํฐ ๋ํผ์ ๊ฐ ํฌ์...?
์ ์ดํด ์๋์์ฃ ?
์ข๋ ์ฝ๊ฒ ์ค๋ช ํ๋ฉด ํ๋กํผํฐ ๋ํผ์์
์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์ถ๊ฐ์ ์ธ ์ถ๋ ฅ๊ฐ์ ์ฃผ๋ ๊ฒ์ ๋๋ค.
์ด๋, ์ถ๊ฐ์ ์ธ ๊ฐ์ ๋ํ๋ด๊ธฐ ์ํด์๋ ๋ฌ๋ฌ ํ์($)๋ฅผ ๋ถ์ฌ์ผ ํ๋๋ฐ์.
์ฝ๋๋ฅผ ๋ณด๋ฉด์ ์ฌ์ฉ๋ฒ์ ์ดํด ๋ณผ๊ฒ์.
@propertyWrapper
struct SmallNumber {
private var number: Int
private(set) var projectedValue: Bool
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"
print(someStructure.someNumber)
// prints "4"
someStructure.someNumber = 55
print(someStructure.$someNumber)
// Prints "true"
์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ๋ฐ๋ก 12๋ณด๋ค ํฌ๋ฉด true, ์์ผ๋ฉด false๋ฅผ ๋ํ๋ด๋ ๊ธฐ๋ฅ์ธ๋ฐ์
์ด๊ฒ์ ๊ตฌํํ๊ธฐ ์ํด
projectedValue ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํด ์ค๋๋ค!!
์ดํ ๊ฐ์ ๊ตฌ๋ณํ๊ธฐ ์ํด get๊ณผ set์์ ๊ธฐ๋ฅ์ ์ ๋ฆฌํด ์ฃผ๊ณ
์ธ๋ถ์์ numberํ๋กํผํฐ์ $๋ฅผ ๋ถ์ฌ์ ์ ๊ทผํ๋ฉด
projectedValue์ ๊ฐ์ ์ถ๋ คํ๊ฒ ๋ฉ๋๋ค!!
์ ๊ธฐํ๋ค์..ใ
$ ๋ก ์์ํ๋ ํ๋กํผํฐ๋ฅผ ์ ์ํ ์ ์๊ธฐ ๋๋ฌธ์
ํฌ์๋ ๊ฐ์ ์ ์ํ ํ๋กํผํฐ๋ฅผ ์ ๋ ๋ฐฉํดํ์ง ์๋๋ค๊ณ ํ๋ค์..
์ค๋ ๊ณต๋ถ๋ ์์ผ๋ก๋ ๊ณ์ ๋์์ด ๋ ๊ฒ๊ฐ์์.
์ฝ์ผ์ ๋ถ๋ค์๊ฒ๋ ๋์์ด ๋์๊ธธ ๋ฐ๋๋๋คใ ใ
๊ฐ์ฌํฉ๋๋น!!
'iOS > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [iOS/Swift] Protocol ์์๋ณด๊ธฐ - (2/3) (0) | 2022.06.10 |
|---|---|
| [iOS/Swift] protocol ์์๋ณด๊ธฐ - (1/3) (0) | 2022.06.06 |
| [iOS/Swift] ์ค๋ฅ์ฒ๋ฆฌ (Error Handling) (0) | 2022.06.03 |
| [iOS/Swift] ํ๋กํผํฐ(Properties) ์์๋ณด๊ธฐ(ํ์ ํ๋กํผํฐ) - (3/3) (0) | 2022.06.03 |
| [iOS/Swift] ํ๋กํผํฐ(Properties) ์์๋ณด๊ธฐ(์ฐ์ฐ ํ๋กํผํฐ) - (2/3) (0) | 2022.06.01 |
- Total
- Today
- Yesterday
- swift ๊ณต๋ถ
- swift urlsession
- ํ๋กํ ์ฝ
- test
- ์ค์ํํธ
- Unit Test
- Property
- ๊ณต๋ถ
- set
- xcode
- ํ๋กํผํฐ
- URLSession
- RX
- observable
- ํ ์คํธ
- ์ค์ํํธ ํ๋กํ ์ฝ
- Protocol
- autolayout
- ios
- network
- XCTest
- ์คํ ๋ ์ด์์
- Clean
- swift
- swift ํ๋กํ ์ฝ
- Swift Network
- func
- ์ค์ํํธ map
- RxSwift
- ์ค์ํํธ ๊ณต๋ถ
| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |