★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公衆號:山青詠芝(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 }