Swift 5.1์์ ์ถ๊ฐ๋ ๊ฐ๋
์ด๋ค.
Property Wrapper(๊ฐ์ธ๋) ์ด๋ฆ๋ต๊ฒ ์ค๋ณต์ด ๋๋ ๋ก์ง์ ํฌํจํ๋ ํ์
์ ์ ์ํ๋ค.
Struct, Enum, Class์์ Wrapping ํ๊ณ ์ถ์ property ์์ @State ๊ฐ์ attribute๋ฅผ ๋ช ์ํด์ ์ฌ์ฉํ๋ค.
WWDC 19 ์์ ์ฝ๋,
UserDefaults์ ๊ฐ์ ์ ์ฅํ๊ณ ๊ฐ์ ธ์ค๊ธฐ ์ํ ์ฝ๋๊ฐ ์ค๋ณต๋๋ค.
class UserManager {
static var useTouchID: Bool {
get { UserDefaults.standard.bool(forKey: "useTouchID") }
set { UserDefaults.standard.set(newValue, forKey: "useTouchID") }
}
static var userEmail: String? {
get { UserDefaults.standard.string(forKey: "userEmail") }
set { UserDefaults.standard.set(newValue, forKey: "userEmail") }
}
static var isLoggedIn: Bool {
get { UserDefaults.standard.bool(forKey: "isLoggedIn") }
set { UserDefaults.standard.set(newValue, forKey: "isLoggedIn") }
}
}
Property Wrapper๋ฅผ ์ด์ฉํด ์ค๋ณต ์ฝ๋๋ฅผ wrapping ํด๋ณด๋ฉด ์๋์ ๊ฐ๊ณ ,
@propertyWrapper
struct UserDefault<T> {
let key: String
let defaultValue: T
var wrappedValue: T {
get { UserDefaults.standard.object(forKey: key) as? T ?? defaultValue }
set { UserDefaults.standard.set(newValue, forKey: key) }
}
}
์ด๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
class UserManager {
@UserDefault(key: "useTouchID", defaultValue: false)
static var useTouchID: Bool
@UserDefault(key: "userEmail", defaultValue: nil)
static var userEmail: String?
@UserDefault(key: "isLoggedIn", defaultValue: false)
static var isLoggedIn: Bool
}
DI์ ํ์ฉ
@propertyWrapper
struct Dependency<T> {
var wrappedValue: T {
DIContainer.shared.resolve()
}
}
// in ViewController
@Dependency var moviesViewModel: MoviesViewModel
~์ ๋ฆฌ~
property ์์ attribute๊ฐ ๋ถ์ผ๋ฉด, Property Wrapper์ wrappedValue๋ก ์ฌ์ฉํ๊ฒ ๋ค๋ ์๋ฏธ์ด๋ค.
Property Wrapper๋ฅผ ์ฌ์ฉํด์ ์ฝ๋์ ์ค๋ณต์ ์ค์ผ ์ ์๋ค.
Property Wrapper
[DI] DI Container, IOC Container ๊ฐ๋
๊ณผ ์์