[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