跳到主要内容

Swift 中 `#available` 和 @available 有什么区别

· 阅读需 3 分钟
GoSwiftUI
goswiftui.com

#available@available 都是与 API 可用性有关的功能。这意味着要一起使用它们,让我们学习区别以及何时使用它们。

可用性条件(#available)被用作 ifwhileguard 语句的条件,以便在运行时查询 API 的可用性。

可用性条件具有以下形式:

if #available(iOS 15, *) {
// statements to execute if the APIs are available
} else {
// fallback statements to execute if the APIs are unavailable
}

@available 是一个声明属性,你将其应用于类或方法声明,以指定这些类或方法所支持的平台。

这里是 @available 使用的一个例子:

@available(iOS 16, *)
func newMethod() {
// A method that available on iOS 16 forward.
}

@available(iOS 16, *)
class NewClass {
// A class that available on iOS 16 forward.
}

概括

#available是针对API 使用者的工具。它可以帮助我们检查基于平台功能的可用性。这有助于我们应对 API 中的重大变改。

@available是针对API 创建者的工具。它可让您指定类/方法的可用性,因此该 API 的使用者知道如何使用它。

例子

假设我有一个类OldClass,带有一个实例方法,oldMethod()

class OldClass {
func oldMethod() {

}
}

随着 iOS 16 的发布,我想添加一种利用 iOS 16 功能的新方法。所以,我创建了一个新方法,newMethod().

作为创作者,我用@available(iOS 16, \*)标记我的方法。

class OldClass {
@available(iOS 16, *)
func newMethod() {
// Method that utilize iOS 16 features.
}

func oldMethod() {

}
}

当我的用户尝试在低于 iOS 16 上使用newMethod()时,他们会得到以下错误

let oldClass = OldClass()

oldClass.newMethod()
// 'newMethod()' is only available in iOS 16 or newer

newMethod() 仅适用于 iOS 16 或更新版本。

这时可以使用#available 来处理这个问题:

let oldClass = OldClass()

if #available(iOS 16, *) {
oldClass.newMethod()
} else {
// Fallback on earlier versions
}