属性
属性提供了关于声明或类型的更多信息。Swift中有两种属性,适用于声明的属性和适用于类型的属性。
您可以通过编写@符号,后跟属性名称和属性接受的任何参数来指定属性:
@attributename
@attributename(attributearguments)
某些声明属性接受的参数指定了有关该属性的更多信息以及它如何应用于特定声明。这些属性参数用圆括号括起来,它们的格式由它们所属的属性来定义。
声明属性
您只能将声明属性应用于声明。
可得到
应用此属性来表示与某些Swift语言版本或某些平台和操作系统版本相关的声明生命周期。
可用属性总是以两个或多个以逗号分隔的属性参数列表形式出现。这些论点以下列平台或语言名称之一开头:
iOS
iOSApplicationExtension
macOS
macOSApplicationExtension
watchOS
watchOSApplicationExtension
tvOS
tvOSApplicationExtension
swift
您还可以使用星号(*)来表示上面列出的所有平台名称上的声明的可用性。指定Swift版本可用性的可用属性不能使用星号。
其余参数可以按任意顺序出现,并指定关于声明生命周期的其他信息,包括重要的里程碑。
不可用参数表示该声明在指定平台上不可用。指定Swift版本可用性时,不能使用此参数。
引入的参数表示引入声明的指定平台或语言的第一个版本。它有以下形式:
introduced:versionnumber
版本号由一到三个正整数组成,用句点分隔。
弃用的参数表示声明已弃用的指定平台或语言的第一个版本。它有以下形式:
deprecated:versionnumber
可选版本号由一到三个正整数组成,用句点分隔。省略版本号表示该声明目前已被弃用,但未提供关于何时发生弃用的任何信息。如果省略版本号,则省略冒号(:)。
过时的观点表明声明已被废弃的指定平台或语言的第一版本。当声明被废弃时,它将从指定的平台或语言中删除,并且不能再使用。它有以下形式:
obsoleted:versionnumber
版本号由一到三个正整数组成,用句点分隔。
消息参数用于提供编译器在发布有关使用已弃用或已废弃声明的警告或错误时显示的文本消息。它有以下形式:
message:message
该消息由一个字符串文字组成。
重命名的参数用于提供文本消息,指示已重命名的声明的新名称。编译器在发布有关使用重命名声明的错误时显示新名称。它有以下形式:
renamed:newname
新名称由一个字符串文字组成。
您可以将重命名的参数与不可用的参数和类型别名声明一起使用,以向代码的客户端指示声明已被重命名。例如,当声明的名称在框架或库的发行版之间更改时,这很有用。
//Firstrelease
protocolMyProtocol{
//protocoldefinition
}
//SubsequentreleaserenamesMyProtocol
protocolMyRenamedProtocol{
//protocoldefinition
}
@available(*,unavailable,renamed:"MyRenamedProtocol")
typealiasMyProtocol=MyRenamedProtocol
您可以在单个声明上应用多个可用属性,以在不同的平台和不同版本的Swift上指定声明的可用性。如果属性指定的平台或语言版本与当前目标不匹配,则可用属性适用的声明将被忽略。如果使用多个可用属性,则有效可用性是平台和Swift可用性的组合。
如果除了平台或语言名称参数之外,可用属性仅指定引入的参数,则可以使用以下简写语法代替:
@available(platformnameversionnumber,*)
@available(swiftversionnumber)
可用属性的简写语法允许简明表示多个平台的可用性。尽管这两种形式在功能上是等价的,但只要有可能,简写形式都是优选的。
@available(iOS10.0,macOS10.12,*)
classMyClass{
//classdefinition
}
指定Swift版本可用性的可用属性不能额外指定声明的平台可用性。相反,使用单独的可用属性来指定Swift版本可用性以及一个或多个平台可用性。
@available(swift3.0.2)
@available(macOS10.12,*)
structMyStruct{
//structdefinition
}
discardableResult
将该属性应用于函数或方法声明,以在调用返回值的函数或方法而不使用其结果时禁止编译器警告。
GKInspectable
应用此属性将自定义的GameplayKit组件属性展示给SpriteKit编辑器UI。应用这个属性也意味着objc属性。
nonobjc
将此属性应用于方法,属性,下标或初始值设定项声明以禁止隐式objc属性。nonobjc属性告诉编译器在Objective-C代码中使该声明不可用,即使可以在Objective-C中表示它。
将此属性应用于扩展与将其应用于未使用objc属性显式标记的扩展的每个成员具有相同的效果。
您可以使用nonobjc属性为用objc属性标记的类中的桥接方法解析循环性,并允许在使用objc属性标记的类中重载方法和初始化程序。
用nonobjc属性标记的方法不能覆盖用objc属性标记的方法。但是,使用objc属性标记的方法可以覆盖使用nonobjc属性标记的方法。同样,标有nonobjc属性的方法也不能满足标记为objc属性的方法的协议要求。
NSApplicationMain
将此属性应用于类以指示它是应用程序委托。使用这个属性相当于调用NSApplicationMain(_:_:)函数。
如果您不使用此属性,请提供一个main.swift文件,其顶级代码调用NSApplicationMain(_:_:)函数,如下所示:
导入AppKit
NSApplicationMain(CommandLine.argc,CommandLine.unsafeArgv)
NSCopying
将此属性应用于类的存储变量属性。此属性使属性的设置器与由copyWithZone(_:)方法返回的属性值的副本合成-而不是属性本身的值。属性的类型必须符合NSCopying协议。
NSCopying属性的行为与Objective-C复制属性属性类似。
NSManaged
将此属性应用于从NSManagedObject继承的类的实例方法或存储变量属性,以指示CoreData根据关联的实体描述在运行时动态提供其实现。对于使用NSManaged属性标记的属性,CoreData还会在运行时提供存储。应用这个属性也意味着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代码,作为枚举名称和案例名称的拼接。案例名称的第一个字母是大写。例如,一个名为PlanetVenus的案例将SwiftPlanet枚举中名为venus的案例暴露给Objective-C代码。
objc属性可选择接受单个属性参数,该参数由一个标识符组成。该标识符为objc属性适用的实体指定要向Objective-C公开的名称。您可以使用此参数来命名类,枚举,枚举个案,协议,方法,获取者,设置者和初始值设定项。如果您为类,协议或枚举指定Objective-C名称,请在名称中包含一个三字母前缀,如Objective-C中的编程约定中所述。下面的示例将ExampleClass的enabled属性的getter作为isEnabledraes公开给Objective-C代码
classExampleClass:NSObject{
@objcvarenabled:Bool{
@objc(isEnabled)get{
//Returntheappropriatevalue
}
}
}
objcMembers
将此属性应用于任何可以具有objc属性的类声明。objc属性隐式添加到类的Objective-C兼容成员,它的扩展,它的子类和它的子类的所有扩展。
大多数代码应该使用objc属性来代替,只公开需要的声明。如果您需要公开许多声明,则可以将它们分组到具有objc属性的扩展中。objcMembers属性对于大量使用Objective-C运行时的内省功能的库很方便。不需要时应用objc属性可以增加二进制大小并对性能产生不利影响。
可测试
将此属性应用于为启用测试编译的模块导入声明,以访问任何标记有内部访问级别修饰符的实体,就好像它们是使用公共访问级别修饰符声明的一样。测试还可以访问使用内部或公共访问级别修饰符标记的类和类成员,就好像它们是使用开放访问级别修饰符声明的一样。
UIApplicationMain
将此属性应用于类以指示它是应用程序委托。使用此属性相当于调用UIApplicationMain函数并将此类的名称作为委托类的名称传递。
如果您不使用此属性,请提供一个main.swift文件,其顶级代码调用UIApplicationMain(_:_:_:_:)函数。例如,如果您的应用程序使用UIApplication的自定义子类作为其主类,请调用UIApplicationMain(_:_:_:_:)函数而不是使用此属性。
声明由InterfaceBuilder使用的属性
InterfaceBuilder属性是InterfaceBuilder用来与Xcode同步的声明属性。Swift提供了以下InterfaceBuilder属性:IBAction,IBOutlet,IBDesignable和IBInspectable。这些属性在概念上与它们的Objective-C对应物相同。
您将IBOutlet和IBInspectable属性应用于类的属性声明。将IBAction属性应用于类的方法声明,并将IBDesignable属性应用于类声明。
应用IBAction,IBOutlet,IBDesignable或IBInspectable属性也意味着objc属性。
类型属性
您只能将类型属性应用于类型。
autoclosure
该属性用于通过自动将该表达式封装在没有参数的闭包中来延迟对表达式的求值。将该属性应用于方法或函数声明中的参数类型,用于不带任何参数且返回表达式类型值的函数类型的参数。有关如何使用autoclosure属性的示例,请参见自动防护和功能类型。
惯例
将此属性应用于函数的类型以指示其调用约定。
约定属性总是以下面的属性参数之一出现。
swift参数用于指示Swift函数引用。这是Swift中函数值的标准调用约定。
block参数用于指示Objective-C兼容块参考。函数值表示为对块对象的引用,这是一个id兼容的Objective-C对象,它将其调用函数嵌入对象中。调用函数使用C调用约定。
c参数用于指示C函数引用。函数值不带上下文并使用C调用约定。
具有C函数调用约定的函数可以用作Objective-C块调用约定的函数,而具有Objective-C块调用约定的函数可以用作Swift函数调用约定的函数。但是,只有非泛型全局函数以及不捕获任何局部变量的本地函数或闭包才能用作C函数调用约定的函数。
逃逸
将此属性应用于方法或函数声明中的参数类型,以指示可以存储该参数的值以供稍后执行。这意味着该值可以超过通话的生命周期。具有转义类型属性的函数类型参数需要明确使用self。为属性或方法。有关如何使用转义属性的示例,请参阅转义闭包。
attribute→@-attribute-name-attribute-argument-clause-opt-
attribute-name→identifier-
attribute-argument-clause→(-balanced-tokens-opt-)-
attributes→attribute-attributes-opt-
balanced-tokens→balanced-token-balanced-tokens-opt-
balanced-token→(-balanced-tokens-opt-)-
balanced-token→[-balanced-tokens-opt-]-
balanced-token→{-balanced-tokens-opt-}-
balanced-token→Anyidentifier,keyword,literal,oroperator
balanced-token→Anypunctuationexcept(-,)-,[-,]-,{-,or}-
显示全部
收起
最新更新 | 文章排行 | 滇ICP备2023006777号 | 网站地图