available
-
应用此属性以指示声明相对于某些Swift语言版本或某些平台和操作系统版本的生命周期。
该available
属性始终显示两个或多个以逗号分隔的属性参数的列表。这些参数以以下平台或语言名称之一开头:
iOS
iOSApplicationExtension
macOS
macOSApplicationExtension
watchOS
watchOSApplicationExtension
tvOS
tvOSApplicationExtension
swift
您还可以使用星号(*
)表示上面列出的所有平台名称上的声明的可用性。available
指定Swift版本可用性的属性不能使用星号。
其余参数可以按任何顺序出现,并指定有关声明生命周期的其他信息,包括重要的里程碑。
-
该unavailable
参数表明该声明在指定平台上不可用。指定Swift版本可用性时,不能使用此参数。
-
该introduced
参数表示将导入声明指定的平台或语言的第一个版本。它具有以下形式:
introduced: version number
该版本号由一至三个正整数,用句点分隔的。
-
该deprecated
表示指定平台或语言在该声明已被否决的第一个版本。它具有以下形式:
deprecated: version number
可选版本号由一到三个正整数组成,以句点分隔。省略版本号表示该声明当前已被弃用,但未提供有关何时发生弃用的任何信息。如果省略版本号,也省略冒号(:
)。
-
该obsoleted
表示指定平台或语言在该声明被废弃的第一个版本。当声明被废弃时,它将从指定的平台或语言中删除,并且不能再使用。它具有以下形式:
obsoleted: version number
该版本号由一至三个正整数,用句点分隔的。
-
该message
参数用于提供编辑器在发出有关使用已弃用或已废弃的声明的警告或错误时显示的文本消息。它具有以下形式:
该消息由字符串文字组成。
-
该renamed
参数用于提供文本消息,指示已重命名的声明的新名称。当发出有关使用重命名声明的错误时,编译器将显示新名称。它具有以下形式:
该新名称由字符串文本。
您可以将该renamed
参数与unavailable
参数和类型别名声明结合使用,以向您的代码的客户端指示已重命名声明。例如,当在框架或库的发行版之间更改声明的名称时,这很有用。
1 // First release
2 protocol MyProtocol {
3 // protocol definition
4 }
5 // Subsequent release renames MyProtocol
6 protocol MyRenamedProtocol {
7 // protocol definition
8 }
9
10 @available(*, unavailable, renamed: "MyRenamedProtocol")
11 typealias MyProtocol = MyRenamedProtocol
您可以available
在单个声明上应用多个属性,以指定声明在不同平台和不同版本的Swift上的可用性。available
如果属性指定与当前目标不匹配的平台或语言版本,则忽略属性适用的声明。如果使用多个available
属性,则有效可用性是平台和Swift可用性的组合。
如果available
属性仅指定introduced
了平台或语言名称参数之外的参数,则可以使用以下简写语法:
1 @available(platform name version number, *)
2 @available(swift version number)
available
属性的简写语法允许简洁地表达多个平台的可用性。虽然这两种形式在功能上是等同的,但只要有可能,最好使用速记形式。
1 @available(iOS 10.0, macOS 10.12, *)
2 class MyClass {
3 // class definition
4 }
available
指定Swift版本可用性的属性不能另外指定声明的平台可用性。而是使用单独的available
属性来指定Swift版本可用性和一个或多个平台可用性。
1 @available(swift 3.0.2)
2 @available(macOS 10.12, *)
3 struct MyStruct {
4 // struct definition
5 }
discardableResult
- 将此属性应用于函数或方法声明,以在调用返回值的函数或方法而不使用其结果时抑制编译器警告。
dynamicMemberLookup
-
将此属性应用于类,结构,枚举或协议,以便在运行时按名称查找成员。该类型必须实现subscript(dynamicMemberLookup:)
下标。
在显式成员表达式中,如果没有对命名成员的相应声明,则表达式被理解为对类型的subscript(dynamicMemberLookup:)
下标的调用,传递包含成员名称作为参数的字符串文字。下标的参数类型可以是符合ExpressibleByStringLiteral
协议的任何类型,其返回类型可以是任何类型。在大多数情况下,下标的参数是一个String
值。例如:
1 @dynamicMemberLookup
2 struct DynamicStruct {
3 let dictionary = ["someDynamicMember": 325,
4 "someOtherMember": 787]
5 subscript(dynamicMember member: String) -> Int {
6 return dictionary[member] ?? 1054
7 }
8 }
9 let s = DynamicStruct()
10
11 // Using dynamic member lookup
12 let dynamic = s.someDynamicMember
13 print(dynamic)
14 // Prints "325"
15
16 // Calling the underlying subscript directly
17 let equivalent = s[dynamicMember: "someDynamicMember"]
18 print(dynamic == equivalent)
19 // Prints "true"
GKInspectable
- 应用此属性以将自定义GameplayKit组件属性公开给SpriteKit编辑器UI。应用此属性也意味着该
objc
属性。
inlinable
-
将此属性应用于函数,方法,计算属性,下标,便利初始化程序或取消初始化程序声明,以将该声明的实现公开为模块的公共接口的一部分。允许编译器使用符号在调用站点的实现的副本替换对可挂起符号的调用。
Inlinable代码可以与public
在任何模块中声明的符号交互,并且它可以与internal
在同一模块中声明的用该usableFromInline
属性标记的符号进行交互。可以内联代码不能与交互private
或fileprivate
符号。
此属性不能应用于嵌套在函数fileprivate
或private
声明中的声明。在inlinable函数内定义的函数和闭包是隐式无法使用的,即使它们不能用此属性标记。
nonobjc
-
将此属性应用于方法,属性,下标或初始化程序声明以抑制隐式objc
属性。该nonobjc
属性告诉编译器在Objective-C代码中使声明不可用,即使它可以在Objective-C中表示它。
将此属性应用于扩展名与将其应用于未明确标记该objc
属性的扩展名的每个成员具有相同的效果。
您可以使用该nonobjc
属性来解析标记有该objc
属性的类中的桥接方法的循环,并允许在标有该objc
属性的类中重载方法和初始化程序。
标记有该nonobjc
属性的方法无法覆盖使用该objc
属性标记的方法。但是,使用该objc
属性标记的方法可以覆盖使用该nonobjc
属性标记的方法。类似地,标记有该nonobjc
属性的方法不能满足标记有该objc
属性的方法的协议要求。
NSApplicationMain
-
将此属性应用于类以指示它是应用程序委托。使用此属性等同于调用该NSApplicationMain(_:_:)
函数。
如果您不使用此属性,请提供一个main.swift
顶层代码调用该NSApplicationMain(_:_:)
函数的文件,如下所示:
1 import AppKit
2 NSApplicationMain(CommandLine.argc, CommandLine.unsafeArgv)
NSCopying
-
将此属性应用于类的存储变量属性。此属性使属性的setter与方法返回的属性值的副本(copyWithZone(_:)
而不是属性本身的值)合成。属性的类型必须符合NSCopying
协议。
该NSCopying
属性的行为方式与Objective-C copy
属性类似。
NSManaged
- 将此属性应用于继承自的类的实例方法或存储变量属性,
NSManagedObject
以指示Core Data根据关联的实体描述在运行时动态提供其实现。对于标有该NSManaged
属性的属性,Core Data还在运行时提供存储。应用此属性也意味着该objc
属性。
objc
-
将此属性应用于可在Objective-C中表示的任何声明,例如,非类型的类,协议,非泛型枚举(约束为整数原始值类型),类,协议和可选的属性和方法(包括getter和setter)协议,初始化程序和下标的成员。该objc
属性告诉编译器可以在Objective-C代码中使用声明。
将此属性应用于扩展名与将其应用于未明确标记该nonobjc
属性的扩展名的每个成员具有相同的效果。
编译器隐式地将该objc
属性添加到Objective-C中定义的任何类的子类。但是,子类不能是通用的,并且不能从任何泛型类继承。您可以将objc
属性显式添加到满足这些条件的子类,以指定其Objective-C名称,如下所述。使用该objc
属性标记的协议不能从未使用此属性标记的协议继承。
objc
在以下情况中还隐式添加了该属性:
- 声明是子类中的覆盖,超类的声明具有该
objc
属性。
- 声明满足具有该
objc
属性的协议的要求。
- 该声明有
IBAction
,IBOutlet
,IBDesignable
,IBInspectable
,NSManaged
,或GKInspectable
属性。
如果将该objc
属性应用于枚举,则每个枚举案例都将作为枚举名称和案例名称的串联公开给Objective-C代码。案件名称的第一个字母是大写的。例如,venus
在Swift Planet
枚举中命名的案例将作为命名案例公开给Objective-C代码PlanetVenus
。
该objc
属性可选地接受单个属性参数,该参数由标识符组成。标识符指定要为objc
属性应用的实体公开给Objective-C的名称。您可以使用此参数来命名类,枚举,枚举情况,协议,方法,getter,setter和初始值设定项。如果为类,协议或枚举指定Objective-C名称,请在名称上包含三个字母的前缀,如使用Objective-C编程中的约定中所述。下面的示例公开了Objective-C代码属性的getter,而不仅仅是属性本身的名称。enabled
ExampleClass
isEnabled
1 class ExampleClass: NSObject {
2 @objc var enabled: Bool {
3 @objc(isEnabled) get {
4 // Return the appropriate value
5 }
6 }
7 }
objcMembers
-
将此属性应用于任何可以具有该objc
属性的类声明。该objc
属性被隐式添加到类的Objective-C兼容成员,其扩展,子类以及其子类的所有扩展。
大多数代码应该使用该objc
属性,以仅公开所需的声明。如果需要公开许多声明,可以将它们分组到具有该objc
属性的扩展中。该objcMembers
属性为大量使用Objective-C运行时的内省工具的库提供了便利。在objc
不需要时应用属性会增加二进制文件大小并对性能产生负面影响。
requires_stored_property_inits
- 将此属性应用于类声明,以要求类中的所有存储属性提供默认值作为其定义的一部分。对于从中继承的任何类推断出此属性
NSManagedObject
。
testable
- 将此属性应用于已
import
启用测试编译的模块的声明,以访问使用internal
访问级别修饰符标记的任何实体,就像使用public
访问级别修饰符声明它们一样。测试还可以访问使用internal
或public
访问级别修饰符标记的类和类成员,就像使用open
访问级别修饰符声明它们一样。
UIApplicationMain
-
将此属性应用于类以指示它是应用程序委托。使用此属性等效于调用UIApplicationMain
函数并将此类的名称作为委托类的名称传递。
如果您不使用此属性,请提供一个main.swift
文件,其中包含调用该UIApplicationMain(_:_:_:_:)
函数的顶级代码。例如,如果您的应用使用自定义子类UIApplication
作为其主要类,请调用该UIApplicationMain(_:_:_:_:)
函数而不是使用此属性。
usableFromInline
-
将此属性应用于函数,方法,计算属性,下标,初始化程序或取消初始化程序声明,以允许该符号用于与声明在同一模块中定义的可嵌入代码中。声明必须具有internal
访问级别修饰符。
与public
访问级别修饰符一样,此属性将声明公开为模块的公共接口的一部分。与此不同public
,编译器不允许usableFromInline
在模块外部的代码中通过名称引用标记的声明,即使导出了声明的符号。但是,模块外部的代码仍然可以通过使用运行时行为与声明的符号进行交互。
使用该inlinable
属性标记的声明可以从inlinable代码中隐式使用。虽然可以应用于声明inlinable
或者usableFromInline
可以应用于internal
声明,但应用这两个属性都是错误的。
warn_unqualified_access
-
将此属性应用于顶级函数,实例方法或类或静态方法,以在没有前置限定符(例如模块名称,类型名称或实例变量或常量)的情况下使用该函数或方法时触发警告。使用此属性可以帮助阻止可从同一范围访问的具有相同名称的函数之间的歧义。
例如,Swift标准库包括具有可比元素的序列的顶级min(_:_ :)函数和min()方法。使用该warn_unqualified_access
属性声明序列方法,以帮助减少在尝试使用Sequence
扩展中的一个或另一个时的混淆。
Interface Builder使用的声明属性
Interface Builder属性是Interface Builder用于与Xcode同步的声明属性。雨燕提供了以下接口生成器属性:IBAction
,IBOutlet
,IBDesignable
,和IBInspectable
。这些属性在概念上与它们的Objective-C对应物相同。
您将IBOutlet
和IBInspectable
属性应用于类的属性声明。将IBAction
属性应用于类的方法声明,将IBDesignable
属性应用于类声明。
运用IBAction
,IBOutlet
,IBDesignable
,或IBInspectable
属性也意味着该objc
属性。
请发表评论