Swift `Selector` syntax sugar



Selectors

ใครหลายคนคงจะจำสิ่งนี้ได้ดี เพราะหลายๆ อย่างบน Cocoa Touch Framework ยังใช้สิ่งนี้อยู่ มาดูกันว่า ก่อนและหลัง Swift 2.2 ที่พึ่งออกมา มีอะไรเปลี่ยนแปลงไปบ้าง

ในยุคก่อน Swift 2.2 และสมัย Objective-C  นั้น Selectors เป็นเพียง String สายหนึ่งซึ่งใช้อ้างถึง method ที่อยู่ใน File เดียวกันขะ Runtime ซึ่งข้อเสียของการใช้ String นั้นคือเกิด Error จากการพิมพ์ผิดพลาดได้ง่าย และไม่มี Autocomplete มาช่วยเหลือ เช่น


Wait for the Code ....

หนึ่งในการตั้งชื่อดีๆ ให้กับ Selectors นั่นคือการเขียนประเภทของ object ที่จะทำให้เกิด action ตามด้วย action ในกรณีด้านบน "ปุ่มถูกกด" นั่นเอง และอย่าลืมว่าเราควรส่ง object ดังกล่าวเป็น parameter ให้กับฟังก์ชั่นที่เขียนขึ้นมาด้วย จะเรียกว่าเป็นธรรมเนียมก็ได้ แม้เราไม่จำเป็นที่จะต้องใช้มันก็ตามที

ลองดูตัวอย่างอื่นๆ กันบ้าง


Wait for the Code ....

ใน Swift 2.2 นั้น Apple ช่วยให้เราเขียน Selector ได้มั่นใจมากขึ้น ถึงแม้ syntax ที่ออกมาจะดูไม่ได้สวยมากเท่าไหร่นัก (บทความต้นฉบับใช้คำว่า Ugly เลยทีเดียว) และมันจะยิ่งหนักไปใหญ่เมื่อเรากำลังเผชิญกับปัญหา Massive View Controller และการใช้ Selector ตัวเดียวกันหลายๆ จุด ลองดูตัวอย่างโค้ดจุดเดียวก่อนนะครับ


Wait for the Code ....

จะเห็นว่าบรรทัดนี้โค้ดยาว และค่อนข้างจะอ่านยากทีเดียว และถ้ามีโค้ดแบบนี้หลายๆ จุดบน View Controller คงจะไม่งามเป้นแน่แท้ ดังนั้น เราลองมาหาวิธีที่จะสามารถรวม Selector พวกนี้ให้รวมอยู่ที่เดียวกัน อาจจะดูดีขึ้นก็ได้นะ


Wait for the Code ....

จากโค้ดด้านบน ดีขึ้นเยอะเลยใช่ไหมครับ ? เรามีที่ที่เดียวที่จะเก็บ selectors ทั้งหมดแล้ว และถ้าอยากใช้อันไหนก็อ้างถึงผ่านตัวแปรของ Action struct ได้เลย เราเลือกชื่อเป็น Action เนื่องจากน่าจะเป็นชื่อที่ดีที่สุดที่ไกล้เคียงกับพฤติกรรมของ selectors แล้วล่ะ ผมคงไม่ต้องบอกนะว่าทำไมเราถึงใช้ Selector ไม่ได้

ที่ประกาศเป็น private เนื่องจากเราคงไม่ต้องการให้ Xcode พ่น error บอกว่าเราประกาศซ้ำ เนื่องจาก selector ควรจะขึ้นอยู่กับ View Controller อันใดอันหนึ่งเท่านั้น ตรงนี้เข้าใจเนอะ แล้ววิธีนี้ใช่วิธีที่ดีที่สุดหรือยัง ? หลังจากที่ครุ่งคิดอยู่นาน ก็นึกขึ้นได้ว่า ทำไมเราไม่ทำเป็น extension ของ Selector ซะเลยล่ะ


Wait for the Code ....

จากโค้ดนี้ นอกจากเราจะทำตามเป้าหมายของเราในการรวบรวม Selector ไว้ในที่เดียวแล้ว เรายังได้ใช้ประโยชน์จาก type inference บน Swift ในการที่เราไม่ต้องพิมพ์ Selector. ด้วย เหมือนกับที่เราใช้วิธีนี้กับ UIColor Extension ที่ทำกันระจำนั่นแหละ


Wait for the Code ....

ลองนำไปใช้ดูนะครับ :)
บทความที่อ่านมาเรียบเรียง: https://medium.com/swift-programming/swift-selector-syntax-sugar-81c8a8b10df3#.5fe2cxbpr

Comments

Popular posts from this blog

12 วิธี การบริการและดูแลลูกค้าในร้าน Starbucks

Command Line Compiling C/C++ ,Java [Windows, Mac]

การเขียนโปรแกรมแก้ปัญหา "โจทย์รูปทรงสมมาตร"