3. Swift 前缀@的关键字.png

通过在 @ 符号后面接上特性名称该特性可接受的参数来指定一个特性,为有关声明或类型提供更多的信息。

@available

用于声明该 API 的使用与特定的平台和系统版本有关,至少有两个特性参数,参数之间用逗号分隔且无关顺序。

参数列表通用以平台标识开头,比如:iOS、OSApplicationExtension、macOS、macOSApplicationExtension、watchOS、watchOSApplicationExtension、tvOS、tvOSApplicationExtension、swift。可以用 * 星号表示所有平台或未来潜在平台。

  1. @available(macOS 10.15, *)
  2. func test() {}
  1. @available(macOS 10.15, iOS 13.0, *)
  2. func test() {}

其他参数:

  • unavailable 表示在指定的平台上是无效的,不能指定版本。如果调用会编译报错
  1. @available(*, unavailable)
  2. func test() {}
  1. @available(iOS, unavailable)
  2. func test() {}
  • introduced 表示从指定平台哪一版本开始引入
  1. @available(iOS, introduced: 13.0)
  2. func test() {}
  1. @available(iOS, introduced: 13.0, unavailable)
  2. func test() {}
  • deprecated 表示从指定平台哪一版本开始弃用。如果调用会编译警告
  1. @available(iOS, deprecated)
  2. func test() {}
  1. @available(iOS, introduced: 13.0, deprecated)
  2. func test() {}
  • obsoleted 表示从指定平台哪一版本开始弃用,相当于 unavailable。如果调用会编译报错
  1. @available(macOS, obsoleted: 13.0)
  2. func test() {}
  • message 提供文本信息。当使用被弃用或者被废弃的声明时,编译器会抛出警告或错误信息
  1. @available(macOS, deprecated: 10.10, message: "该方法已废弃")
  2. func test() {}
  • renamed 表示被重命名的新名称。当使用声明的旧名称时,编译器会报错提示新名称
  1. @available(*, unavailable, renamed: "NewProtocol")
  2. protocol OldProtocol {}
  3. protocol NewProtocol {}
  4. class MyClass: NewProtocol {}
  • 综合例子
  1. @available(iOS, introduced: 2.0, deprecated: 8.0, message: "Header views are animated along with the rest of the view hierarchy")
  2. func test() {}

@discardableResult

用于函数或方法的声明,以屏蔽函数或方法被调用却没有接收其返回值的警告。

  1. class MyClass {
  2. /**
  3. 直接调用方法 MyClass.test(value: "hello"), 但不接收返回值
  4. 编译会报警告 Result of call to 'test(value:)' is unused
  5. 为了屏蔽这种警告,可在方法前添加 `@discardableResult` 声明
  6. */
  7. @discardableResult
  8. static func test(value: String) -> String {
  9. return value.uppercased()
  10. }
  11. }

@testable

给导入模块添加 @testable 声明,这样在单元测试中就可以访问到这个模块
image.png

@convention

我们可以将一个函数作为参数传入另一个函数,在 iOS 中能作为函数参数的包括:

  1. C 的函数指针
  2. OC 的 Block
  3. Swift 的闭包 Closure

@convention 是用来修饰闭包的,需要传递一个参数:
@convention(swift) 表明这个是一个 Swift 的闭包
@convention(block) 表明这个是一个兼容 OC 的 Block 的闭包
@convention(c) 表明这个是兼容 C 的函数指针的闭包

image.png
image.png
image.png

[备注]:语法参考 代码参考

@inlinable

修饰函数,表示可内联的函数

[备注]: