[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

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

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

ความเร็วเน็ตที่แท้จริง Mbps MBps ???

Popular

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

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

[Android] เปิดเครื่องไม่ได้ โลโก้ค้าง (Boot Loop)

ความเร็วเน็ตที่แท้จริง Mbps MBps ???

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

[Java] Java Static Variable และ Static Method

Push Notification คืออะไร มีวิธีทำอย่างไร (No Code)

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

[Java] Spring Framework กับความสามารถ Dependency Injection

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