Bài viết được dịch từ trang web Appcoda

Một năm trước đây, Apple đã mang Swift đến với chúng ta, một ngôn ngữ lập trình mới cho cả hai hệ điều hành iOS và OS X. Khi nó lần đầu tiên được công bố, cũng giống như những lập trình viên iOS khác, tôi đã rất vui sướng. Được quảng cáo là một ngôn ngữ nhanh chóng và an toàn, Swift giờ đây đã phát triển để trở thành một trong những ngôn ngữ lập trình phổ biến nhất. Đúng như mong đợi, công ty này đã giới thiệu Swift 2 tại hội nghị WWDC năm nay. Tôi may mắn đã có cơ hội tham gia hội nghị đó, và hôm nay tôi sẽ chia sẻ lại với bạn một số điểm cập nhật của ngôn ngữ Swift.

"Chúng tôi đang tập trung vào phát triển Swift 2 trong năm nay. Chúng tôi nghĩ rằng Swift là ngôn ngữ lập trình lớn kế tiếp, tất cả chúng ta sẽ lập trình các ứng dụng và hệ thống trong 20 năm tới bằng ngôn ngữ này. Chúng tôi nghĩ rằng nó nên được có mặt ở khắp mọi nơi và được sử dụng bởi tất cả mọi người."

Craig Federighi, Phó Chủ tịch cấp cao phụ trách công nghệ phần mềm của Apple

Ngôn ngữ lập trình Swift 2 có gì mới?

Thông thường thì chúng ta đo nhiệt độ bằng thang đo là độ C hoặc độ F. Nhưng tại hội nghị WWDC, chúng tôi ước lượng sự phổ biến của một tính năng mới bằng đơn vị decibel. Hai tràng pháo tay lớn nhất trong năm nay là khi Apple công bố việc hỗ trợ UI testing trong Xcode 7 và Swift trở thành mã nguồn mở. Nếu bạn đã bỏ sót một số điểm quan trọng trong hội nghị WWDC hoặc gần đây không cập nhật tin tức, thì vâng bạn đã đọc đúng rồi đấy: Swift trở thành mã nguồn mở. Đây là một điều thật tuyệt vời. Vào cuối năm nay, Apple sẽ phát hành mã nguồn của Swift tới cộng đồng, bao gồm cả trình biên dịch và các thư viện chuẩn, theo giấy phép OSI-compliant. Apple cũng sẽ port mã nguồn đó sang Linux. Các lập trình viên sẽ có thể đóng góp vào sự phát triển của ngôn ngữ này và viết các chương trình trên Linux sử dụng Swift. Trong thực tế, bạn đã được khuyến khích đóng góp vào sự phát triển của ngôn ngữ này.

Đi cùng với tin tức thú vị này, Swift 2 bao gồm một số tính năng mới như cải tiến việc quản lý lỗi, protocol extensions, và kiểm tra phiên bản. Hãy để tôi cung cấp cho bạn một vài nét tổng quan về những cập nhật này nhé!

Quản lý 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.

Hãy tưởng tượng bạn đang mô hình hóa một động cơ xe hơi. Động cơ này có thể bị lỗi vì những lý do sau đây:

  • Không có nhiên liệu (No fuel)
  • Rò rỉ dầu (Oil leakage)
  • Ắc qui yếu (Low battery)

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:

enum CarEngineErrors: ErrorType {
    case NoFuel
    case OilLeak
    case LowBattery
}

Để tạo ra một function có khả năng ném ra một lỗi, bạn sử dụng từ khóa throws trong khai báo của nó. Dưới đây là một ví dụ:

func checkEngine() throws {
}

Để ném ra một lỗi trong function này, bạn sử dụng câu lệnh ném. Dưới đây là một function mẫu thực hiện một kiểm tra đơn giản về động cơ xe hơi nói trên:

let fuelReserve = 20.0
let oilOk = true
let batteryReserve = 0.0
 
func checkEngine() throws {
    guard fuelReserve > 0.0 else {
        throw CarEngineErrors.NoFuel
    }
    
    guard oilOk else {
        throw CarEngineErrors.OilLeak
    }
    
    guard batteryReserve > 0.0 else {
        throw CarEngineErrors.LowBattery
    }
}

Từ khóa guard có thể là mới đối với bạn. Nó được giới thiệu lần đầu tiên trong Swift 2 nhằm cải tiến luồng control. Khi đoạn code trên thực thi đến câu lệnh guard, đầu tiên nó sẽ kiểm tra điều kiện. Nếu ước lượng điều kiện trả về false, thì phần else sẽ được thực thi. Trong đoạn code ở trên, function đó sẽ ném ra một lỗi nếu một điều kiện nào đó không thỏa mãn.

Để gọi cái function ném đó, bạn đặt từ khóa try phía trước lời triệu gọi. Dưới đây là một ví dụ:

func startEngine() {
    try checkEngine()
}

Nếu bạn viết đoạn code trên trong Playgrounds, bạn sẽ kết thúc với một lỗi vì chúng ta vẫn chưa quản lý những lỗi đó. Mô hình quản lý lỗi trong Swift yêu cầu bạn phải sử dụng một câu lệnh do-catch để bắt tất cả các lỗi và xử lý chúng.

Dưới đây là một function mẫu xác định phải làm gì khi bắt được một lỗi:

func startEngine() {
    do {
        try checkEngine()
        print("Engine started", appendNewline: true)
    } catch CarEngineErrors.NoFuel {
        print("No Fuel!")
    } catch CarEngineErrors.OilLeak {
        print("Oil Leak!")
    } catch CarEngineErrors.LowBattery {
        print("Low Battery!")
    } catch {
        // Default
        print("Unknown reason!")
    }
} 

Mỗi mệnh đề catch phù hợp với một lỗi cụ thể và bạn xác định sẽ làm gì trong phần body. Trong ví dụ phía trên, biến batteryReserve được thiết lập giá trị bằng 0. Trong trường hợp này, lỗi .LowBattery sẽ được ném ra khi bạn gọi function startEngine().

Thử thiết lập giá trị của biến batteryReserve thành 1.0. Trong trường hợp này, không có lỗi nào bị ném ra và dòng chữ 'Engine started’ được in ra.

Tương tự như câu lệnh switch, mô hình quản lý lỗi trong Swift 2 là rất toàn diện. Bạn phải quản lý tất cả các lỗi có thể xảy ra. Đây là lý do tại sao chúng ta cần phải bao gồm một mệnh đề catch mà không xác định một pattern.

Nếu bạn muốn tìm hiểu thêm về quản lý lỗi trong Swift, tôi đề xuất bạn nên đọc các tài liệu trên Apple Documentation.

Không còn phương thức 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()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:

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.

Điều này thực sự tuyệt vời phải không nào?

Kiểm tra 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
    
} 

do-while bây giờ thành 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

Tôi hy vọng rằng bạn thích đọc bài viết tổng quan một vài điểm mới về Swift 2 này. Có rất nhiều thứ mới mẻ mà tôi chưa có thời gian để khám phá. Bạn có thể tham khảo video về hội nghị WWDC này để biết được nhiều thông tin hơn về Swift 2. Tại thời điểm viết bài này, một số công ty vẫn đang sử dụng Objective-C như là ngôn ngữ chính để lập trình iOS. Có thể chính bạn cũng đang lập trình bằng ngôn ngữ Objective-C. Tôi tin chắc rằng Swift sẽ là ngôn ngữ phát triển bùng nổ trong tương lai. Trong thực tế, tất cả các phiên thảo luận chính tại hội nghị WWDC 2015 đều nói về Swift. Vì vậy nếu bạn vẫn chưa bắt đầu học Swift, thì bây giờ là lúc để bắt tay vào hành động.

Để tham khảo thêm, bạn có thể tải về file Playground của bài tutorial này ở đây. Hãy chắc chắn rằng bạn sử dụng Xcode 7 để chạy đoạn code trên, vì đó là phiên bản Xcode duy nhất hỗ trợ Swift 2.0. Xcode 7 hiện đang ở phiên bản beta. Bạn có thể tải nó về từ Apple.

Khóa học lập trình di động tại Techmaster:

Để cài đặt MacOSX lên phần cứng không phải Apple liên hệ chuyên gia cài Hackintosh:

  • Nguyễn Minh Sơn: 01287065634
  • Huỳnh Minh Sơn: 0936225565
  • Website: caidatmacos.com