+1

Cách thực hiện các ràng buộc API với @available trong Swift

Bài viết này là một mẹo rất nhanh về cách giúp bạn giới hạn code của mình với một số phiên bản hoặc làm cho nó hoàn toàn không khả dụng trong Swift.

Ví dụ: khi bạn đang phát triển framework, bạn muốn cập nhật việc call API của mình sử dụng async / await chỉ tương thích với iOS 15 trở lên. Điều này có thể được thực hiện bằng cách sử dụng available API.

Vấn đề

Bạn đang phát triển một framework nhưng cần giới hạn một số phần của nó với phiên bản iOS hoặc cao hơn. Và cần làm cho một phần khác của code hoàn toàn không khả dụng.

Hãy cùng xem ví dụ dưới đây:

class ExternalFramework {


    public func addByTwo(value: Int) -> Int {
        printTwo()
        return value + 2
    }

    private func printTwo() {
        print("2")
    }

}

Code rất đơn giản. Chỉ là một lớp ExternalFramework làm ví dụ về framework ngoài và hai chức năng. Cái đầu tiên trả về Integer và là public và cái thứ hai chỉ cần in "2" trong console.

Hãy hạn chế việc sử dụng chức năng addByTwo chỉ dành cho iOS 15 trở lên bằng cách sử dụng available. Xem hình bên dưới:

image.png

Tiếp tục khám phá từng thuộc tính chú thích.

Thuộc tính Deprecated

Nếu bạn muốn cảnh báo người dùng của mình rằng API này không còn được dùng cho iOS 11 trở lên, bạn chỉ cần thêm cái này:

    @available(iOS, deprecated: 11 )
    public func addByTwo(value: Int) -> Int {
        printTwo()
        return value + 2
    }

Kết quả là người gọi nhận được cảnh báo khi cố gắng sử dụng hàm: image.png

Thuộc tính Message

Thuộc tính message bạn phải sử dụng với thuộc tính deprecated. Để gửi thông báo cho những người sử dụng API cũ rằng có điều gì đó đã thay đổi và cách họ có thể cập nhật những thay đổi.

    @available(iOS, deprecated: 11, message: "Use at your own risk" )
    public func addByTwo(value: Int) -> Int {
        printTwo()
        return value + 2
    }

image.png

Thuộc tính Introduced

Khi bạn muốn hạn chế khả năng sử dụng chức năng với @available, về cơ bản, bạn cần cung cấp hai thứ về cơ bản: platform và version được hỗ trợ tối thiểu.

@available(platform name, platform version)

Ví dụ: nếu bạn muốn rằng chức năng của bạn chỉ hoạt động trong iOS 12 trở lên. Bạn có thể làm được việc này:

    @available(iOS, introduced: 12)
    public func addByTwo(value: Int) -> Int {
        printTwo()
        return value + 2
    }

Bằng cách này, bạn có thể giới hạn những người có thể sử dụng chức năng của bạn. Nhưng điều gì sẽ xảy ra nếu bạn cố gắng sử dụng một phương pháp mà phiên bản iOS của bạn không tương thích? image.png

Xcode cung cấp cho bạn ba lựa chọn thay thế cho điều này.Việc đầu tiên là thực hiện kiểm tra #avaliable:

let externalFramework = ExternalFramework()
if #available(iOS 15, *) {
    externalFramework.addByTwo(value: 100)
} else {
    // Fallback on earlier versions
}

Phương thức thứ hai : sử dụng @available(iOS 15, ) vào phương thức gọi của hàm externalFramework.addByTwo. Và cách cuối là bạn thêm @available(iOS 15, ) vào đầu class đó

Thuộc tính Renamed

Khi bạn cần một API framework để thay đổi tên, chỉ cần thêm thuộc tính đã đổi tên vào một hàm deprecated như sau:

     @available(iOS, deprecated: 11, renamed: "addByForSureTwo")
    public func addByTwo(value: Int) -> Int {
        printTwo()
        return value + 2
    }

Xcode rất tiện dụng khi bạn sử dụng điều này vì nó đã đề xuất sửa thành phương thức mới, ngay cả khi phương thức đó không tồn tại.

image.png

Thuộc tính Unavailable

Và thuộc tính cuối cùng, nếu bạn không muốn người dùng của mình sử dụng API, thuộc tính này là dành cho bạn! Bạn thậm chí có thể hiển thị một thông báo cho người dùng.

@available(iOS, unavailable, message: "This API will be supported and could not be used anymore")
public func addByTwo(value: Int) -> Int {
    printTwo()
    return value + 2
}

image.png

Kết luận

Luôn luôn tốt nếu biết các lựa chọn thay thế để viết API tuyệt vời. Hi vọng qua bài viết này sẽ giúp bạn tạo ra các đoạn code hoàn hảo và bảo mật.

Nguồn: https://holyswift.app/how-to-do-apis-constraints-with-available-in-swift


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.