Như các bạn đã biết, rạng sáng 9/6 tại hội nghị WWDC 2015 Apple đã cho ra mắt Swift 2 với một loạt các tính năng mới dành cho các nhà phát triển như Mô hình quản lý lỗi, Cải tiển cú pháp hay Protocol extensions...vv. Hôm nay chúng ta hãy cùng nhau tìm hiểu về Availability Checking (nôm na là kiểm tra tính khả dụng) - một tính năng mà nhiều lập trình viên đã chờ đợi mỏi mòn từ rất lâu…

1. Câu chuyện của ngày xưa

Mỗi năm Apple lại release phiên bản OS mới cùng với một loạt các tính năng và APIs mới đi kèm, thông thường thì chúng không được hỗ trợ trên các hệ điều hành trước. Và bất cứ ai đã từng phát triển sản phẩm trên iOS hay OS X đều chung một cảm nhận về sự buồn tẻ và ngán ngẩn khi cứ phải viết những dòng code rõ loằng ngoằng chỉ để kiểm tra xem API mình sử dụng có khả năng thực thi trên thiết bị, hay phiên bản hệ điều hành đích của mình hay không.

Thử tưởng tượng bạn đang phát triển ứng dụng trên iOS 8, ứng dụng của bạn có một Timeline được cập nhật rất nhiều thông tin mỗi ngày cho người dùng; và khách hàng muốn ứng dụng đó hỗ trợ cả **3D touch **trên iOS 9 để người dùng có nhiều trải nghiệm hơn với app mà bạn phát triển. Trước kia developer phải thêm đoạn code để kiểm tra tính khả dụng của 3D touch như sau:

if (traitCollection.respondsToSelector(Selector("forceTouchCapability")))
    && (traitCollection.forceTouchCapability == UIForceTouchCapability.Available) {
        // code 3D touch
}

Hay

if (NSProcessInfo().isOperatingSystemAtLeastVersion(NSOperatingSystemVersion(majorVersion: 9,minorVersion: 0, patchVersion: 0)))
    && (traitCollection.forceTouchCapability == UIForceTouchCapability.Available) {
        // code 3D touch
}

Như các bạn đã thấy code khá là loằng ngoằng, hơn nữa developer phải tốn rất nhiều thời gian để thêm các đoạn code vào để kiểm tra tính khả dụng. Chỉ cần quên thêm vào ở một đoạn thôi là sẽ bị crash khi chạy trên phiên bản cũ từ iOS 8 trở xuống.

**2. Câu chuyện của ngày nay **

Bây giờ thì với tính năng kiểm tra tính khả dụng của Swift 2, developer đã nhàn nhã hơn nhiều với những dòng code ngắn gọn và dễ hiểu:

if #available(iOS 9.0, *) {
    if (traitCollection.forceTouchCapability == UIForceTouchCapability.Available) {
        // code 3D touch
    }
}  else {
        // code cho các version cũ hơn
}

**3. Cú pháp **

#available trong ví dụ trên dùng để kiểm tra tính khả dụng trên hệ điều hành từ iOS 9 trở đi. WildCard * là bắt buộc phải có với ý ám chỉ chung platform hiện tại được liệt kê ra và các phiên bản mới hơn của platform đó sẽ xuất hiện trong tương lai.

3.1 Kiểm tra tính khả dụng trên nhiều platform khác nhau

Giả sử bạn muốn kiểm tra tính khả dụng trên iOS 9, OS X El Capitan, watchOS 2...vv Rất đơn giản với việc liệt kê thêm chúng vào list các platform như sau:

if #available(iOS 9, OSX 10.11, watchOS 2, tvOS 1, *) {
        // code iOS 9, OS X 10.0, watchOS 2 and tvOS 1
}

3.2 Kiểm tra tính khả dụng trên cả classes và methods

Vâng, điều này là có thể. Và cũng chỉ với một thao tác đơn giản là thay thế #available bằng @available mà thôi:

@available(iOS 9.0, *)
func configureFor3DTouch() {
    if (traitCollection.forceTouchCapability == UIForceTouchCapability.Available) {
        // code 3D touch
    }
 }

3.3 Guard là gì?

Nếu function của bạn chỉ chạy trên hệ điều hành từ phiên bản xác định nào đó trở đi? Guard là ý tưởng cho trường hợp đó. Function dưới đây sẽ return ngay nếu nó không chạy trên phiên bản hệ điều hành từ iOS 9 trở lên.

func configureFor3DTouch() {
    guard #available(iOS 9.0, *) else {
        return
    }
    // code 3D touch
}

4. Tổng kết

Vậy là chúng ta đã tìm hiểu xong về tính năng kiểm tra tính khả dụng trên các phiên bản OS của Swift 2. Như các bạn đã thấy nó giải phóng lập trình viên khỏi những dòng code buồn tẻ. Không chỉ khiến chương trình nhìn sáng sủa và dễ hiểu hơn, nó còn giúp lập trình viên tránh được crash khi chạy ứng dụng trên các phiên bản cũ của hệ điều hành và đương nhiên là dễ fixbug hơn rồi. ^^ Còn chờ gì nữa mà không thử nghiệm nhỉ?

Tài liệu tham khảo

https://www.hackingwithswift.com/new-syntax-swift-2-availability-checking

http://useyourloaf.com/blog/checking-api-availability-with-swift.html

http://code.tutsplus.com/tutorials/swift-20-availability-checking--cms-24340

http://www.codingexplorer.com/api-availability-checking-in-swift-2/