"ความรักต้องไม่พยายาม"
มีอะไรใหม่สำหรับ Swift Language ใน Xcode 6 beta 5
5 Aug 2014 17:59   [5123 views]

ค่อยๆเติบโตเป็นผู้ใหญ่ทีละนิดๆสำหรับ 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 สิงหาคมนี้ ก็ดูกันต่อไปว่าจะมีอะไรดีขึ้นบ้าง ค่อยเป็นค่อยไปโนะ!

บทความที่เกี่ยวข้อง

Jul 10, 2014, 21:07
7337 views
มือถือแอนดรอยด์จอ 1080p กับคำว่า "ชัดเกินไป"
Jul 16, 2014, 10:44
13954 views
รู้สึกตัวอีกที ทุกอย่างของฉันก็อยู่บน Cloud
0 Comment(s)
Loading