[WWDC20] Swift มีอะไรใหม่ที่น่าสนใจบ้าง? (Part2)
จาก Part ที่แล้วที่เราคุยกัน ถึงอัพเดทว่ามีอะไรใหม่ๆ บ้าง (Part 1 ดูที่นี่) ใน Swift ซึ่งส่วนมากจะเป็นของตัว Perfomance ซะส่วนมาก
มารอบนี้ เราจัดกันต่อ กับการเขียนโปรแกรมกันซะที Developer จะได้อ่านแล้วเพลินกันมากขึ้นเนอะ 🥰
Language & Libraries
มีการอัพเดททั้งตัวภาษาเองและ Libraries ที่มาใช้งานเพิ่ม เพียบ ซึ่งแต่ละตัว เด็ดๆทั้งนั้น
Multiple trailing closure syntax
สามารถใช้ trailing closure ได้หลาย parameter แล้ว ! ยกตัวอย่างที่ทุกคนต้องเจอกันบ่อยๆ คือ UIView.animate(withDuration:animations:completion)
KeyPath expressions as functions
เราสามารถส่ง KeyPath ไปโดยมี signature เป็น function ได้แล้ว ช่วยให้เราเขียนโค้ดได้ reusable มากขึ้น รวมถึง readability ที่อ่านง่ายขึ้นอีกด้วย ขอยกตัวอย่างจาก ใน WWDC20 เลยนะ เข้าใจได้ง่ายดีด้วย
สร้าง Entry Point ของโปรแกรมด้วย @main
สามารถเลือกได้แล้วว่า จะให้ class ไหนเป็น Entry Point เมื่อเราเริ่มโปรแกรม
ถ้าเป็นแต่ก่อนก็ต้องใช้ @UIApplicationMain สำหรับ UIKit แต่หลังจากนี้ไป ใช้ @main แทนได้เลย ซึ่งก็ง่ายขึ้นพอสมควร
Increased availability of implicit self in closures
ใน closure ไม่จำเป็นต้องใส่ self เพื่อเรียก refer ไปหา object แล้ว! เลิฟ อันนี้มากๆ
แต่ก็มีอยู่สองกรณีนะ ถ้าเป็น Class หรือ reference type เราจะต้อง capture self ไว้ แต่ถ้าเป็น Struct เราไม่จำเป็นต้องมีก็ได้ เช่น
Multi-pattern catch clauses
catch error สามารถเลือก catch ได้หลาย type แล้ว เผื่ออารมณ์หลายๆ Error เราอยาก Handle ไปในทางเดียวกัน 🌟
Synthesized Comparable conformance for enum
เมื่อ enum conform Comparable ไม่จำเป็นต้อง implement ตัว Comparable แล้วสำหรับ enum แล้ว ถ้าเราต้องการจะ compare ค่าของ enum พวก เท่ากับ, มากกว่า, น้อยกว่าโดยเรียงจากลำดับของ case ที่เราประกาศ ง่ายชะมัด
Enum cases as protocol witnessses
ตัวนี้จริงๆ ที่มันทำ คือ ทำให้ Enum สามารถ matching กับ protocol witness ได้
ซึ่งเวอร์ชั่นเก่าๆ ตัว Enum เองไม่สามารถทำได้
ส่วนใครอยากรู้ว่า protocol witness คืออะไร ลองดูจาก
https://www.youtube.com/watch?v=3BVkbWXcFS4 หรือ https://forums.swift.org/t/protocol-witness-matching-mini-manifesto/32752 ดูเพิ่มเติมนะ
Float16
เพิ่ม Type ใหม่ ที่ confirm เข้ากับ BinaryFloatingPoint กับ SIMDScalar เจ้าตัวนี้จะใช้บ่อยกับการคำนวนโดยใช้ GPU เป็นหลัก
ปรับการทำงานของ didSet
มีการเพิ่มประสิทธิภาพในการทำงานของ didSet เพิ่มขึ้น โดยที่เราไม่ต้องแก้ไขโค้ดเพิ่มเลย
จากเดิมไม่ว่ายังไง didSet ก็จะมีการเรียกใช้ getter เพื่อให้มี oldValue (ค่าก่อนหน้า) มาใช้งานเสมอ แม้เราจะไม่ได้มีการเรียกใช้งาน oldValue เลยก็ตาม
การปรับครั้งนี้ สั้นๆง่ายๆคือ ถ้าเราไม่มีการเรียกใช้ oldValue และ ไม่มีการใช้ willSet คู่ด้วย ตัว Swift จะข้ามการเรียกใช้ getter ของ oldValue ไปให้เลยทันที
where
clauses on contextually generic declarations
เพิ่มความสามารถให้สามารถ where บน method ด้วยการใช้ generic ได้
ยกตัวอย่างเช่น
ถ้าเป็น Swift ที่ต่ำกว่า 5.3 จะ compile error แต่ตอนนี้สามารถใช้งานได้แล้ว!
ช่วยให้เวลาเราเขียน extension หรืออื่นๆ เราไม่จำเป็นต้องแยก extension เป็นหลายๆส่วน แต่เขียนรวมด้วยกันในที่เดียว แล้วแยกด้วย where clause แทนได้เลย :)
Credit