@available: 可用来标识计算属性、函数、类、协议、结构体、枚举等类型的生命周期。(依赖于特定的平台版本 或 Swift 版本)
available 特性经常与参数列表一同出现,该参数列表至少有两个特性参数,参数之间由逗号分隔。这些参数由以下这些平台名字中的一个起头:
- iOS
- iOSApplicationExtension
- macOS
- macOSApplicationExtension
- watchOS
- watchOSApplicationExtension
- tvOS
- tvOSApplicationExtension
- swift
可以用一个星号(*)来表示上面提到的所有平台。
@available(*, deprecated, message: "Objective-C garbage collection is no longer supported")
open func finalize()
其中参数如下:
- unavailable:表示该声明在指定的平台上是无效的。
- introduced:表示指定平台从哪一版本开始引入该声明。格式如下:
introduced: 版本号
- deprecated:表示指定平台从哪一版本开始弃用该声明。虽然被弃用,但是依然使用的话也是没有问题的。格式如下:若省略版本号,则表示目前弃用,同时可直接省略冒号。
deprecated: 版本号
- obsoleted:表示指定平台从哪一版本开始废弃该声明。当一个声明被废弃后,它就从平台中移除,不能再被使用。格式如下:
obsoleted: 版本号
- message:说明信息。当使用被弃用或者被废弃的声明时,编译器会抛出警告或错误信息。格式如下:
message: "说明信息"
- renamed:新的声明名称信息。当使用旧声明时,编译器会报错提示修改为新名字。格式如下:
renamed: "新的声明名称"
- 如果 available 特性除了平台名称参数外,只指定了一个 introduced 参数,那么可以使用以下简写语法代替:
@available(平台名称 版本号, *)
举例:
// 存储属性是不能够使用 @available 的!!!
@available(iOS 7.0, *) ❌
var property: String?
// 计算属性可以使用 @available
let number1 = 1
let number2 = 2
@available(iOS 7.0, *) ✅
var sum: Int {
get {
return number1 + number2
}
}
// 结构体
@available(iOS 7.0, *)
struct MyStruct { }
// 枚举
@available(iOS 7.0, *)
enum MyEnum { }
// 协议
@available(iOS 7.0, *)
protocol MyProtocol { }
// 类
@available(iOS 7.0, *)
class MyClass { }
@available(iOS, introduced: 7.0, deprecated: 10.0, message: "Please Use newFunction instead")
func oldFunction() { }
func newFunction() { }
网友评论
if (@available(iOS 11.0, *)) {}
会crash吗
if (@available(iOS 11.0, *)) {
} else {
// Fallback on earlier versions
}
}