Xuất phát từ sở thích muốn làm một sản phẩm đã ấp ủ khá lâu bằng IOS, sau môt thời gian tìm hiểu đắn đo tôi đã quyết định chọn swift 2.0 làm ngôn ngữ chính cho việc phát triển sản phẩm của tôi. Sau khi khi tìm hiểu phiên bản swift 2.0 tôi có tóm tắt những điểm khác biệt của swift2.0 so với những phiên bản trước như sau:

Bắt lỗi(Error Handling)

Đôi khi một số thứ có thể bị lỗi. Khi một function bị lỗi, cách tốt nhất là bắt được lỗi đó và hiểu được tại sao nó lại lỗi. Swift phiên bản 1 thiếu hụt một mô hình quản lý lỗi thích hợp. Trong Swift 2, nó đi kèm một mô hình quản lý lỗi ngoại lệ bằng cách sử dụng các từ khóa try/ throw / catch.

Trong Swift, các lỗi được đại diện bởi các giá trị của các kiểu phù hợp với protocol ErrorType. Trong trường hợp này, bạn có thể tạo ra một enumeration chấp nhận ErrorType để mô hình hóa các điều kiện lỗi. Chúng ta có thẻ tham khảo code mẫu như sau:

// 1 enum DrinkError: ErrorType { case NoBeerRemainingError } // 2 func drinkWithError() throws { if beer.isAvailable() { // party! } else { // 3 throw DrinkError.NoBeerRemainingError } } func tryToDrink() { // 4 do { try drinkWithError() } catch { print("Could not drink beer! :[") return } }

Có một vài thứ nổi bật như sau:

  1. Để tạo ra một lỗi để ném ra, đơn giản là tạo một enum để lấy từ ErrorType.

  2. Bạn cần dùng keyword throws để đánh dấu một function nào đó có thể ném ra lỗi.

  3. Thay thế khối try/catch bằng khôi do/catch trong khối này có thể thêm từ khoá try vào để ném ra lỗi

Bỏ phương thức println(No More println())

Có một thứ mà tôi nhận thấy khi đang viết bài tutorial này đó là sự thiếu vắng của function println(). Trong Swift 2, chúng ta chỉ có thể sử dụng print() để viết một cái gì đó ra ngoài. Apple đã kết hợp cả hai function println() và print() thành một. Nếu bạn muốn xuất ra một cái gì đó cùng một dòng mới, bạn có thể thiết lập tham số appendNewline bằng true. Dưới đây là một ví dụ:

print(“Engine started”, appendNewline: true)

Protocol Extensions

Trong phiên bản đầu tiên của Swift, bạn có thể sử dụng các extension để bổ sung thêm các chức năng mới tới một class, structure hoặc enumeration đang tồn tại. Swift 2 cho phép các lập trình viên áp dụng các extension tới các kiểu protocol. Với Protocol Extensions, bạn có thể bổ sung thêm các function hoặc properties tới tất cả các class tuân theo một protocol nhất định. Điều này là rất hữu ích khi bạn muốn mở rộng các chức năng của protocol.

Ví dụ, chúng ta hãy tạo ra một protocol mới có tên là Awesome. Protocol này có thể được implemented bởi bất kỳ kiểu nào mà cung cấp một cách để trả về một chỉ số của một đối tượng cụ thể theo phần trăm.

protocol Awesome { func awesomenessPercentage() -> Float }

Bây giờ chúng ta khai báo hai class mà thông qua protocol mới đó. Mỗi class thực hiện phương thức được yêu cầu của protocol Awesome đó:

class Dog: Awesome { var age: Int! func awesomenessPercentage() -> Float { return 0.85 } } class Cat: Awesome { var age: Int! func awesomenessPercentage() -> Float { return 0.45 } } let dog = Dog() dog.awesomenessPercentage() let cat = Cat() cat.awesomenessPercentage()

Nếu bạn khởi tạo các class trên và gọi phương thức awesomenessPercentage() trong Playground, bạn sẽ nhìn thấy đầu ra như thế này:

swift2-protocol-ket-qua-1

Giả sử rằng bạn muốn mở rộng protocol Awesome để cung cấp một thuộc tính awesomenessIndex, trong đó sử dụng kết quả của phương thức awesomenessPercentage() để tính toán chỉ số tương ứng. Bạn có thể viết code giống như sau:

extension Awesome { var awesomenessIndex: Int { get { return Int(awesomenessPercentage() * 100) } } }

Bằng cách tạo ra một extension trên protocol đó, tất cả các class mà thông qua protocol Awesome tự động có thể truy cập tới thuộc tính awesomenessIndex.

swift2-protocol-extension-ket-qua-2

Kiểm tra các phiên bản(Availability Checking)

Mọi lập trình viên đều biết sự khó khăn khi xây dựng một ứng dụng hỗ trợ nhiều phiên bản iOS khác nhau. Bạn luôn muốn sử dụng phiên bản mới nhất của các API, nhưng đôi khi điều này có thể là nguyên nhân gây ra lỗi khi ứng dụng đó chạy trên những phiên bản iOS cũ hơn. Trước khi có Swift 2, không có cách chuẩn nào để làm công việc kiểm tra phiên bản đó. Ví dụ, class NSURLQueryItem chỉ có từ phiên bản iOS 8 trở đi. Nếu bạn sử dụng class này trên những phiên bản iOS cũ hơn, bạn sẽ kết thúc với một lỗi và có thể đó là nguyên nhân gây cho ứng dụng của bạn bị crash. Để ngăn chặn lỗi này, bạn có thể thực hiện việc kiểm tra phiên bản như sau:

if NSClassFromString("NSURLQueryItem") != nil { // iOS 8 or up } else{ // Earlier iOS versions }

Đây là một cách để kiểm tra xem liệu class đó có tồn tại hay không. Bắt đầu với Swift 2, cuối cùng nó cũng đi kèm một hỗ trợ built-in trong việc kiểm tra tính sẵn sàng của các API. Bạn có thể dễ dàng xác định một điều kiện có sẵn sàng hay không để khối code sẽ chỉ thực thi trong các phiên bản iOS xác định. Dưới đây là một ví dụ:

if #available(iOS 8, *) { // iOS 8 or up let queryItem = NSURLQueryItem() } else { // Earlier iOS versions }

Vòng lặp “do-while” is bây giờ là “repeat-while”

Vòng lặp do-while cổ điển giờ đây được đổi tên thành repeat-while. Dưới đây là một ví dụ:

var i = 0 repeat { i++ print(i) } while i < 10

Tổng Kết

Hi vọng bài viết này sẽ phần nào giúp các bạn mường tượng về những thứ mới mẻ mà swift 2.0 mang lại. Bản thân tôi thi thấy thích nhất phần quản lý lỗi  và extension bởi vì nó giúp tôi quản lý các lỗi một cách khoa học hơn, đồng thời cũng dễ dàng mở rộng khi phát sinh loại lỗi mới.

Tham Khảo

https://www.raywenderlich.com/108522/whats-new-in-swift-2

http://www.appcoda.com/swift-2-introduction/

https://developer.apple.com/swift/blog/?id=29