Swift5.1 語言參考(七) 屬性

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公衆號:山青詠芝(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
應用此屬性以將自定義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 }
相關文章
相關標籤/搜索