[iOS] Property Wrapper ความสามารถในการเขียน Annotation บน Swift

        Property Wrapper ถ้าแปลตามชื่อก็คือการปั้นตัวแปร เพื่อให้มีค่าเริ่มต้นตามที่กำหนด หรือความสามารถพิเศษตามที่เราต้องการ โดยอาศัยการระบุ annotation นำหน้าไปเท่านั้น !!! ลองมาดูวิธีใช้งานกันครับ

ก่อนอื่น ต้องสร้าง annotation ที่เราต้องการก่อน

    @propertyWrapper 
    struct Capitalized {
        var wrappedValue: String {
            didSet { wrappedValue = wrappedValue.capitalized }
        }
        init(wrappedValue: String) {
            self.wrappedValue = wrappedValue.capitalized
        }
    }

        โดย @propertyWrapper เป็น attribute ที่บังคับต้องมี โดย datatype จะต้องตรงกับ attribute ที่เราเอาไปใช้งานด้วย ซึ่งตรงนี้เรามีการเพิ่มความสามารถ capitalized เข้าไปใน didSet ด้วย


ตัวอย่างการใช้งาน

    struct User {
        @Capitalized var firstName: String
        @Capitalized var lastName: String
    }
    // firstName = Lord, lastName = Gift
    var user = User(firstName: "lord", lastName: "gift")

หรือเราจะประกาศพร้อม assign value แบบนี้เลยก็ได้

    // hello = Hello
    @Capitalized(wrappedValue: "hello") var hello: String

    // world = World
    @Capitalized var world = "world"

จะเห็นว่าความสามารถจาก @Capitalized ถูกใส่เข้าไปโดยอัตโนมัติเรียบร้อยแล้ว 


ลองมาดูอีกตัวอย่าง ที่ใช้งานร่วมกับ Generic Types

    @propertyWrapper
    struct UserDefault<T> {
        let key: String
        var wrappedValue: T {
            get {
                return UserDefaults.standard.object(forKey: key) as! T
            }
            set {
                UserDefaults.standard.set(newValue, forKey: key)
            }
        }
    }

        ตัวอย่างนี้ @UserDefaults จะช่วยกำหนดค่าเริ่มต้นโดยดึงจาก UserDefaults และถ้ามีการ assign value ก็จะถูก update ลง UserDefaults โดยอัตโนมัติเช่นกัน 

    @UserDefault(key:"email")
    var email: String?

        จะเห็นว่าเราสามารถออกแบบให้ @propertyWrapper ช่วยในการลดรูปของโค้ดที่เราใช้ประจำโดยไม่ต้องเขียนซ้ำ ๆ ได้ดีทีเดียว

        ถึงตรงนี้ ใครที่เคยรู้จักกับ Java Annotation มาก่อน อาจงง ๆ เพราะใน Java จะไม่ได้เป็นการกำหนดค่า แต่เป็นการระบุเฉยๆ จากนั้นจะมีการ implement method เพื่อ apply ความสามารถต่างๆ ไม่ใช่การสร้างตัวแปรเหมือนใน Swift ยังไงก็ ระวังด้วยนะครับ 😊😊😊


ref: 
https://www.swiftbysundell.com/articles/property-wrappers-in-swift/ 
https://medium.com/macoclock/ios-swift-property-wrappers-propertywrapper-f60ee8e6d02f

Facebook Comment

Recent Posts

Popular post of 7 days

Portal คืออะไรกันนะ???

[Java] ความแตกต่างระหว่าง Overloading กับ Overriding

Port Forwarding สำหรับคนใช้ AIS Fibre

Popular

Portal คืออะไรกันนะ???

[Java] ความแตกต่างระหว่าง Overloading กับ Overriding

มาตรฐานการตั้งชื่อตัวแปร (Naming Convention)

เรื่องของ ++i กับ i++

Port Forwarding สำหรับคนใช้ AIS Fibre

วิธีการสมัคร Apple Developer Program และ Enterprise Program ฉบับลงมือเอง

ลืมรหัสปลดล็อค Android เข้าเครื่องไม่ได้ มีทางออกครับ

ทดสอบ Mobile App แบบ Automated ด้วย Appium ทำยังไงกันนะ

Deeplink, Universal Links คืออะไร ทำงานร่วมกับ Mobile App ได้ยังไง

Android Auto & Apple Carplay คืออะไร ใช้งานยังไง