Swift5.3 语言参考(七) 属性
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/9740502.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
属性提供有关声明或类型的更多信息。Swift中有两种属性,即适用于声明的属性和适用于类型的属性。
您可以通过编写@
符号后跟属性的名称以及属性接受的任何参数来指定属性:
1 @attribute name 2 @attribute name(attribute arguments)
某些声明属性接受参数,这些参数指定有关属性的更多信息以及它如何应用于特定声明。这些属性参数括在括号中,它们的格式由它们所属的属性定义。
声明属性
您只能将声明属性应用于声明。
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
参数用于提供编辑器在发出有关使用已弃用或已废弃的声明的警告或错误时显示的文本消息。它具有以下形式:message: message
该消息由字符串文字组成。
-
该
renamed
参数用于提供文本消息,指示已重命名的声明的新名称。当发出有关使用重命名声明的错误时,编译器将显示新名称。它具有以下形式:renamed: new name
该新名称由字符串文本。
您可以将该
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-Ccopy
属性类似。 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
在SwiftPlanet
枚举中命名的案例将作为命名案例公开给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
属性。
输入属性
您只能将类型属性应用于类型。
autoclosure
- 此属性用于通过将表达式自动包装在不带参数的闭包中来延迟表达式的求值。将此属性应用于方法或函数声明中的参数类型,以获取不带参数且返回表达式类型值的函数类型的参数。有关如何使用该
autoclosure
属性的示例,请参阅Autoclosures和Function Type。 convention
-
将此属性应用于函数类型以指示其调用约定。
该
convention
属性始终显示以下属性参数之一。- 该
swift
参数用于表示Swift函数引用。这是Swift中函数值的标准调用约定。 - 该
block
参数用于表示与Objective-C兼容的块引用。函数值表示为块对象的引用,块对象是一个id
兼容的Objective-C对象,它将其调用函数嵌入到对象中。调用函数使用C调用约定。 - 该
c
参数用于表示C函数引用。函数值不带上下文并使用C调用约定。
具有C函数调用约定的函数可以用作具有Objective-C块调用约定的函数,具有Objective-C块调用约定的函数可以用作具有Swift函数调用约定的函数。但是,只有非通用全局函数,以及不捕获任何局部变量的本地函数或闭包,才能用作具有C函数调用约定的函数。
- 该
escaping
- 将此属性应用于方法或函数声明中的参数类型,以指示可以存储参数的值以供稍后执行。这意味着允许该值超过调用的生命周期。具有
escaping
type属性的函数类型参数需要显式使用self.
属性或方法。有关如何使用该escaping
属性的示例,请参阅转义闭包。
1 GRAMMAR OF AN ATTRIBUTE 2 3 attribute → @ attribute-name attribute-argument-clause opt 4 5 attribute-name → identifier 6 7 attribute-argument-clause → ( balanced-tokens opt ) 8 9 attributes → attribute attributes opt 10 11 balanced-tokens → balanced-token balanced-tokens opt 12 13 balanced-token → ( balanced-tokens opt ) 14 15 balanced-token → [ balanced-tokens opt ] 16 17 balanced-token → { balanced-tokens opt } 18 19 balanced-token → Any identifier, keyword, literal, or operator 20 21 balanced-token → Any punctuation except (, ), [, ], {, or }