๐ŸŽ Apple/Swift

[Swift] Property Wrapper

JINiOS 2023. 4. 23. 13:36
728x90

Property Wrapper ๋ž€?

Swift์—์„œ property wrapper๋Š” ์†์„ฑ์„ ๊ฐ์‹ธ๊ณ  ์ถ”๊ฐ€ ๋™์ž‘์„ ์ œ๊ณตํ•˜๋Š” ๋ž˜ํผ(wrapper) ํƒ€์ž…์ž…๋‹ˆ๋‹ค. 

 

Property Wrapper์˜ ์žฅ์ 

Property Wrapper๋Š” ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ , ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์ค„์ด๋ฉฐ, ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ ์–‘์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

Swift์— ์ด๋ฏธ ์กด์žฌํ•˜๋Š” Property Wrapper

1. @IBOutlet - Interface Builder์˜ ์•„์šธ๋ ›์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค ์š”์†Œ์™€ ์—ฐ๊ฒฐ๋œ ์†์„ฑ์„ ์„ ์–ธํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
2. @Published - SwiftUI์˜ ObservableObject ์†์„ฑ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ํ•ด๋‹น ์†์„ฑ์ด ์—…๋ฐ์ดํŠธ ๋  ๋•Œ๋งˆ๋‹ค observer์—๊ฒŒ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์•Œ๋ฆฌ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
3. @EnvironmentObject - SwiftUI์—์„œ ํ™˜๊ฒฝ ๊ฐœ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ „์—ญ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐœ์ฒด๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
4. @State - SwiftUI์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ํ•ด๋‹น ์†์„ฑ์ด ์—…๋ฐ์ดํŠธ ๋  ๋•Œ๋งˆ๋‹ค UI๊ฐ€ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
5. @ObservedObject - SwiftUI์—์„œ ObservableObject ์†์„ฑ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ํ•ด๋‹น ์†์„ฑ์ด ์—…๋ฐ์ดํŠธ ๋  ๋•Œ๋งˆ๋‹ค UI๊ฐ€ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

์‚ฌ์šฉ์ž ์ •์˜ Property Wrapper

Swift 5.1๋ถ€ํ„ฐ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ ๋ž˜ํผ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @propertyWrapper ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†์„ฑ ๋ž˜ํผ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ, ๊ฐ’์„ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜ค๊ธฐ ์ „์— ๋ณ€ํ™˜ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ EmailValidation ์†์„ฑ ๋ž˜ํผ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

@propertyWrapper
struct EmailValidation {
    private var value: String = ""
    
    var wrappedValue: String {
        get { value }
        set {
            if newValue.isValidEmail {
                value = newValue
            } else {
                print("Invalid email address")
            }
        }
    }
}

extension String {
    var isValidEmail: Bool {
        // ์ด๋ฉ”์ผ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋กœ์ง
        return true
    }
}

class User {
    @EmailValidation var email: String
}

let user = User()

user.email = "invalid"  // Invalid email address ์ถœ๋ ฅ
user.email = "test@test.com"  // email ์†์„ฑ์— ๊ฐ’ ์ €์žฅ


์œ„์˜ ์˜ˆ์ œ์—์„œ, EmailValidation ์†์„ฑ ๋ž˜ํผ๋Š” wrappedValue๋ฅผ ๊ฐ์‹ธ๊ณ  ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. User ํด๋ž˜์Šค์—์„œ @EmailValidation ์†์„ฑ ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ email ์†์„ฑ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. email ์†์„ฑ์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด wrappedValue์˜ setter๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ , ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ํ›„ ๊ฐ’์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

728x90