zoukankan      html  css  js  c++  java
  • 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属性标记的符号进行交互。可以内联代码不能与交互privatefileprivate符号。

    此属性不能应用于嵌套在函数fileprivateprivate声明中的声明。在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属性的协议的要求。
    • 该声明有IBActionIBOutletIBDesignableIBInspectableNSManaged,或GKInspectable属性。

    如果将该objc属性应用于枚举,则每个枚举案例都将作为枚举名称和案例名称的串联公开给Objective-C代码。案件名称的第一个字母是大写的。例如,venus在Swift Planet枚举中命名的案例将作为命名案例公开给Objective-C代码PlanetVenus

    objc属性可选地接受单个属性参数,该参数由标识符组成。标识符指定要为objc属性应用的实体公开给Objective-C的名称。您可以使用此参数来命名类,枚举,枚举情况,协议,方法,getter,setter和初始值设定项。如果为类,协议或枚举指定Objective-C名称,请在名称上包含三个字母的前缀,如使用Objective-C编程中的约定中所述。下面的示例公开了Objective-C代码属性的getter,而不仅仅是属性本身的名称。enabledExampleClassisEnabled

    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访问级别修饰符声明它们一样。测试还可以访问使用internalpublic访问级别修饰符标记的类和类成员,就像使用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同步的声明属性。雨燕提供了以下接口生成器属性:IBActionIBOutletIBDesignable,和IBInspectable。这些属性在概念上与它们的Objective-C对应物相同。

    您将IBOutletIBInspectable属性应用于类的属性声明。将IBAction属性应用于类的方法声明,将IBDesignable属性应用于类声明。

    运用IBActionIBOutletIBDesignable,或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
    将此属性应用于方法或函数声明中的参数类型,以指示可以存储参数的值以供稍后执行。这意味着允许该值超过调用的生命周期。具有escapingtype属性的函数类型参数需要显式使用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 }

     

  • 相关阅读:
    影视感悟
    缩写字母
    从工程文化和运维理念理解Netflix
    telinit:Did not receive a reply.Possible causes include:the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired
    centos6 ext4修复
    windows显示日期时间(精确到秒)
    【C#】IDispose接口的应用
    【转】【WPF】WPF 自定义快捷键命令(Command)
    【转】【WPF】MVVM模式的3种command
    【转】【WPF】WriteableBitmap应用及图片数据格式转换
  • 原文地址:https://www.cnblogs.com/strengthen/p/9740502.html
Copyright © 2011-2022 走看看