★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:http://www.javashuo.com/article/p-mxcwusaj-eb.html
➤若是连接不是山青咏芝的博客园地址,则多是爬取做者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持做者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★html
属性提供有关声明或类型的更多信息。Swift中有两种属性,即适用于声明的属性和适用于类型的属性。git
您能够经过编写@
符号后跟属性的名称以及属性接受的任何参数来指定属性:github
1 @attribute name 2 @attribute name(attribute arguments)
某些声明属性接受参数,这些参数指定有关属性的更多信息以及它如何应用于特定声明。这些属性参数括在括号中,它们的格式由它们所属的属性定义。编程
您只能将声明属性应用于声明。swift
available
应用此属性以指示声明相对于某些Swift语言版本或某些平台和操做系统版本的生命周期。api
该available
属性始终显示两个或多个以逗号分隔的属性参数的列表。这些参数以如下平台或语言名称之一开头:数组
iOS
iOSApplicationExtension
macOS
macOSApplicationExtension
watchOS
watchOSApplicationExtension
tvOS
tvOSApplicationExtension
swift
您还可使用星号(*
)表示上面列出的全部平台名称上的声明的可用性。available
指定Swift版本可用性的属性不能使用星号。微信
其他参数能够按任何顺序出现,并指定有关声明生命周期的其余信息,包括重要的里程碑。闭包
该unavailable
参数代表该声明在指定平台上不可用。指定Swift版本可用性时,不能使用此参数。app
该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
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用于与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 }