Swift 中 `#available` 和 @available 有什么区别
· 阅读需 3 分钟
#available
和 @available
都是与 API 可用性有关的功能。这意味着要一起使用它们,让我们学习区别以 及何时使用它们。
可用性条件(#available
)被用作 if
、while
和 guard
语句的条件,以便在运行时查询 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
这时可以使用#available
来处理这个问题:
let oldClass = OldClass()
if #available(iOS 16, *) {
oldClass.newMethod()
} else {
// Fallback on earlier versions
}