ค่อยๆเติบโตเป็นผู้ใหญ่ทีละนิดๆสำหรับ Swift ภาษาโปรแกรมมิ่งใหม่จาก Apple ที่ตอนนี้น่าจะผ่านมาครึ่งทางของความสมบูรณ์แล้ว ก็อย่างที่บอก มันต้องใช้เวลาราวๆ 6 เดือนถึงจะเริ่มอยู่ตัว ที่ผ่านมามีคนติดต่อให้ไปสอน Swift ตลอดเลย แต่ยังไม่กล้าสอนหงะ Syntax ยังเปลี่ยนทุก 10 วันอยู่เลย -0-
เมื่อวานนี้ Apple ก็เพิ่งปล่อยเวอร์ชั่นใหม่อย่าง Xcode 6 beta 5 มาให้นักพัฒนาไปเล่นโน่นเล่นนี่กัน มีอะไรใหม่ๆน่าสนใจเยอะเหมือนกัน ขอคัดเอาสิ่งที่น่าสนใจที่กระทบต่อการเขียนโปรแกรมมาเล่าให้ฟังละกันนะ
การเปลี่ยนแปลงกับ Optional
Optional ซึ่งเป็นโอเปอเรเตอร์ประกอบ Type ที่เอาไว้บอกว่าตัวแปรนั้นๆสามารถเป็น nil ได้ รวมถึงยังช่วย Handle Runtime Error ด้วยท่า Optional Chaining
ใน beta 5 มีการเปลี่ยนแปลงกับ Optional หลายอย่าง ดังนี้
- UIView, NSView, UIFont, and UIApplicationDelegate เริ่มเข้าสู่โลกของ Optional อย่างเต็มตัว ก่อนหน้านี้จะมีปัญหาเรื่องคลาสเหล่านี้ยังไม่ถูกเตรียมการณ์มาเพื่อ Swift เท่าไหร่นัก จึงเกิดปัญหาการ Unwrap ของ Optional Value ซึ่งทำให้แอพฯ Crash ในกรณีที่มีตัวแปรใน Chain เป็น nil แต่ก็ยังเป็นแค่จุดเริ่มต้น ยังมีปัญหาแบบเดียวกันนี้อีกเพียบ Apple ยังทยอยแก้ไขอยู่ใน Release ถัดๆไป
- ตอนนี้เราสามารถใช้ == และ != ในการ Compare Optional Value ได้แล้ว
var x: Int? = nilif x == nil { }
- เราใช้ Optional Value เป็น Boolean Operation ไม่ได้อีกแล้ว เพราะก่อนหน้านี้มันทำให้สับสนมากพอสมควร ถ้าจะ Compare ต้องใช้ == หรือ !=
var y: Bool? = trueif y { // Error }if y == true { // OK }
- ใช้ Unwrapped Optional Value ในการ Assign ค่าได้แล้ว
var x: Int! = 0x! = 2x!++
รวมถึงพวก Dictionary ก็สามารถแก้ไขค่าโดยตรงได้แล้วเช่นกัน
var sequences = ["fibonacci": [1, 1, 2, 3, 0]] sequences["fibonacci"]![4] = 5 sequences["fibonacci"]!.append(8)
Operation ใหม่ ??
อะไรแปลกๆเพิ่มมาอีกแล้วก็ไม่รู้ 555 คราวนี้เป็น ?? (งงตั้งแต่ Operator)
การใช้งานจะคล้ายๆกับ Short Form ของ if statement ใช้ร่วมกับ Optionals เอาไว้ดูว่าฝั่งซ้ายมีค่าหรือเปล่า ถ้าไม่มีค่าให้ใช้ค่าฝั่งขวาแทน เช่น
var x: Int? = nilprintln(x ?? 12) // Got 12x = 10println(x ?? 12) // Got 10
ก็สะดวกดี ไม่งั้นต้องพิมพ์ยาวกว่านี้ตั้งเยอะ
เพิ่มตัวแปรประเภท Range
ก่อนหน้านี้ Swift มี Range Operator เพื่อใช้ในการ Loop อยู่สองแบบคือ Half-Open Range และ Closed Range
แต่ตอนนี้มี Range ตัวใหม่ขึ้นมา เป็นดั่ง Collection ที่ไว้เก็บข้อมูลเริ่มต้นและสิ้นสุด ประกาศได้เหมือนตัวแปรทั่วไป ดังนี้
var r = 3.14...12
ซึ่งจะเห็นว่าไม่จำเป็นต้องเป็นจำนวนเต็มเสมอไป เป็น float ก็ได้ แต่มีเงื่อนไขว่าตัวเริ่มต้นต้องน้อยกว่าตัวสิ้นสุด ไม่งั้นจะ Compile Time Error
และตัวแปรที่ได้ออกมาเป็นจะเป็น Range ซึ่งมีอยู่หลายรูปแบบ เช่น HalfOpenInterval หรือ ClosedInterval แล้วแต่ Operator ที่ประกาศ
ซึ่งตัวแปรประเภท Range นี้สามารถนำมา Compare กันได้ด้วย
let r = 3.14...12let s = 3.14...12if r == s { }
นอกจากนั้น ยังมีการเปลี่ยนแปลงของคำสั่งเกี่ยวกับ Range อีกหลายตัว เช่น ReverseRange ไม่มีให้ใช้แล้ว ให้ใช้ lazy(0...10).reverse() แทน (เหมือนตั้งแต่ beta 4 แล้วตรงนี้)
for index in lazy(1...10).reverse() { index}
แล้วก็มี stride มาให้ใช้ เพื่อ Iterate จากค่านึงไปยังอีกค่านึงแบบไม่ใช่ทีละ +1
for z in stride(from: 3.1, to: 3.14, by: 0.02) { z }
ในขณะเดียวกับ คำสั่ง .by ของ Range ก็ถูกเอาออกไปแล้วเช่นเดียวกัน ไปใช้ stride อย่างเดียวนะจ๊ะ
Array เพิ่ม first และ last
Array มี Property เพิ่มสองตัวคือ first และ last เอาไว้ดึงตัวแปรแรกและตัวแปรสุดท้ายของ Array ออกมา แต่ถ้าไม่มีค่าก็จะส่ง nil ออกมาแทนในรูปแบบ Optional
var arr = ["Hello"]arr.removeAtIndex(0)var firstStr: String? = arr.first // nil
เปลี่ยนชื่อโน่นเปลี่ยนชื่อนี่
มีการเปลี่ยนชื่อตามแนวทางที่เปลี่ยนไปหลายตัวเหมือนกัน
- พวก Protocol Standard มีการเพิ่ม ible, able และ Type ต่อท้ายตามเห็นสมควร สำหรับ LogicValue ตอนนี้ก็เปลี่ยนให้ดูเข้าใจง่ายขึ้นเป็น BooleanType
- มีการยกคุณค่าของ Immutable ให้กลายเป็นมาตรฐานด้วยการให้คนอนุมานว่าถ้าไม่มีคำว่า Mutable นั่นแปลว่ามันคือ Immutable ไป ในที่นี้จึงเปลี่ยน UnsafeConstPointer และ UnsafePointer เป็น UnsafePointer และ UnsafeMutablePointer ตามลำดับ (เปลี่ยนเป็นคนละอย่างกันแต่ชื่อเหมือนกันเชียวนะ ตายๆ) ส่วน Pointer ทุกอย่างก็เปลี่ยนไปในแนวเดียวกันเช่นกัน
- UnsafeArray และ UnsafeMutableArray เปลี่ยนชื่อเป็น UnsafeBufferPointer และ UnsafeMutableBufferPointer ตามลำดับ
Dynamic declaration modifier
เพิ่มการเข้าถึงตัวแปรระหว่าง Swift และ Objective-C ด้วย @objc ซึ่งให้ประสิทธิภาพที่ดีกว่า dynamic
final class Foo : SomeBaseClass { // Always accessed by objc_msgSend: may be swizzled at runtime, etc, // even though Foo is final. dynamic var x: Int // Visible and accessed by objc_msgSend from ObjC; // may be accessed by more efficient lookup mechanisms in Swift. @objc var y: Int // Exposed to ObjC if SomeBaseClass is an Objective-C class, // or derived from one. var z: Int }
เปลี่ยนชื่อ Operator และ Attribute
- เปลี่ยน @auto_closure เป็น @autoclosure
- เอา @assignment ออก
- @prefix @infix และ @postfix ถูกเปลี่ยนจากการเป็น attribute ไปเป็น declaration modifier ดังนั้นจากนี้ไม่ต้องใส่ @ อีกต่อไป และมีการสลับตำแหน่งนิดหน่อยจาก operator prefix - { } เป็น prefix operator - { }
- เอา @class_protocol ออก ตอนนี้ประกาศเป็น protocol P : class { ... } ได้เลย
- += สำหรับ Array ไม่ได้ append element อีกต่อไป แต่ใช้ในการ concat arrays เข้าด้วยกัน
Swift Command Line Interface !
- ใช้ Swift รันในเชิง Script ผ่าน Command Line ได้แล้ว !
- สามารถใส่ Breakpoint เข้าไปใน Code เพื่อ Debug ได้ในกรณีรันผ่าน Command Line
1> func test() { 2. println("This is a test") 3. } 4> :b 2 5> test()
ที่เหลือก็เป็นเรื่องจิปาถะทั่วไปจนถึงเรื่อง Performance ที่ดีขึ้นครับ =)
สำหรับ beta 6 มีกำหนดออกวันที่ 15 สิงหาคมนี้ ก็ดูกันต่อไปว่าจะมีอะไรดีขึ้นบ้าง ค่อยเป็นค่อยไปโนะ!