通过在 @ 符号后面接上特性名称和该特性可接受的参数来指定一个特性,为有关声明或类型提供更多的信息。
@available
用于声明该 API 的使用与特定的平台和系统版本有关,至少有两个特性参数,参数之间用逗号分隔且无关顺序。
参数列表通用以平台标识开头,比如:iOS、OSApplicationExtension、macOS、macOSApplicationExtension、watchOS、watchOSApplicationExtension、tvOS、tvOSApplicationExtension、swift。可以用 * 星号表示所有平台或未来潜在平台。
@available(macOS 10.15, *)
func test() {}
@available(macOS 10.15, iOS 13.0, *)
func test() {}
其他参数:
- unavailable 表示在指定的平台上是无效的,不能指定版本。如果调用会编译报错
@available(*, unavailable)
func test() {}
@available(iOS, unavailable)
func test() {}
- introduced 表示从指定平台哪一版本开始引入
@available(iOS, introduced: 13.0)
func test() {}
@available(iOS, introduced: 13.0, unavailable)
func test() {}
- deprecated 表示从指定平台哪一版本开始弃用。如果调用会编译警告
@available(iOS, deprecated)
func test() {}
@available(iOS, introduced: 13.0, deprecated)
func test() {}
- obsoleted 表示从指定平台哪一版本开始弃用,相当于 unavailable。如果调用会编译报错
@available(macOS, obsoleted: 13.0)
func test() {}
- message 提供文本信息。当使用被弃用或者被废弃的声明时,编译器会抛出警告或错误信息
@available(macOS, deprecated: 10.10, message: "该方法已废弃")
func test() {}
- renamed 表示被重命名的新名称。当使用声明的旧名称时,编译器会报错提示新名称
@available(*, unavailable, renamed: "NewProtocol")
protocol OldProtocol {}
protocol NewProtocol {}
class MyClass: NewProtocol {}
- 综合例子
@available(iOS, introduced: 2.0, deprecated: 8.0, message: "Header views are animated along with the rest of the view hierarchy")
func test() {}
@discardableResult
用于函数或方法的声明,以屏蔽函数或方法被调用却没有接收其返回值的警告。
class MyClass {
/**
直接调用方法 MyClass.test(value: "hello"), 但不接收返回值
编译会报警告 Result of call to 'test(value:)' is unused
为了屏蔽这种警告,可在方法前添加 `@discardableResult` 声明
*/
@discardableResult
static func test(value: String) -> String {
return value.uppercased()
}
}
@testable
给导入模块添加 @testable 声明,这样在单元测试中就可以访问到这个模块
@convention
我们可以将一个函数作为参数传入另一个函数,在 iOS 中能作为函数参数的包括:
- C 的函数指针
- OC 的 Block
- Swift 的闭包 Closure
@convention 是用来修饰闭包的,需要传递一个参数:
@convention(swift) 表明这个是一个 Swift 的闭包
@convention(block) 表明这个是一个兼容 OC 的 Block 的闭包
@convention(c) 表明这个是兼容 C 的函数指针的闭包
@inlinable
修饰函数,表示可内联的函数
[备注]: