鍍金池/ 教程/ iOS/ 特性(Attributes)
特性(Attributes)
Access Control 權(quán)限控制的黑與白
基本運(yùn)算符(Basic Operators)
基礎(chǔ)部分(The Basics)
閉包(Closures)
擴(kuò)展
泛型參數(shù)(Generic Parameters and Arguments)
訪問控制和 protected
語句(Statements)
模式(Patterns)
WWDC 里面的那個(gè)“大炮打氣球”
關(guān)于語言參考(About the Language Reference)
語法總結(jié)(Summary of the Grammar)
嵌套類型
類型(Types)
Swift 初見(A Swift Tour)
泛型
枚舉(Enumerations)
高級(jí)運(yùn)算符
繼承
析構(gòu)過程
關(guān)于 Swift(About Swift)
訪問控制
類和結(jié)構(gòu)體
內(nèi)存安全
Swift 與 C 語言指針友好合作
協(xié)議
屬性(Properties)
可選類型完美解決占位問題
錯(cuò)誤處理
字符串和字符(Strings and Characters)
聲明(Declarations)
自動(dòng)引用計(jì)數(shù)
Swift 里的值類型與引用類型
表達(dá)式(Expressions)
Swift 文檔修訂歷史
造個(gè)類型不是夢(mèng)-白話 Swift 類型創(chuàng)建
歡迎使用 Swift
詞法結(jié)構(gòu)(Lexical Structure)
集合類型(Collection Types)
下標(biāo)
方法(Methods)
可選鏈?zhǔn)秸{(diào)用
版本兼容性
類型轉(zhuǎn)換
構(gòu)造過程
The Swift Programming Language 中文版
函數(shù)(Functions)
Swift 教程
控制流(Control Flow)

特性(Attributes)


1.0 翻譯:Hawstein 校對(duì):numbbbbb, stanzhai

2.0 翻譯+校對(duì):KYawn

2.1 翻譯:小鐵匠 Linus

4.1 翻譯+校對(duì):mylittleswift

本頁內(nèi)容包括:

特性提供了有關(guān)聲明和類型的更多信息。在 Swift 中有兩種特性,分別用于修飾聲明和類型。

您可以通過以下方式指定一個(gè)特性:符號(hào) @ 后跟特性的名稱和特性接收的任何參數(shù):

@ 特性名

@ 特性名特性參數(shù)

有些聲明特性通過接收參數(shù)來指定特性的更多信息以及它是如何修飾某個(gè)特定的聲明的。這些特性的參數(shù)寫在圓括號(hào)內(nèi),它們的格式由它們所屬的特性來定義。

聲明特性

聲明特性只能應(yīng)用于聲明。

available

available 特性用于聲明時(shí),表示該聲明的生命周期與特定的平臺(tái)和操作系統(tǒng)版本有關(guān)。

available 特性經(jīng)常與參數(shù)列表一同出現(xiàn),該參數(shù)列表至少有兩個(gè)特性參數(shù),參數(shù)之間由逗號(hào)分隔。這些參數(shù)由以下這些平臺(tái)名字中的一個(gè)起頭:

  • iOS
  • iOSApplicationExtension
  • macOS
  • macOSApplicationExtension
  • watchOS
  • watchOSApplicationExtension
  • tvOS
  • tvOSApplicationExtension

當(dāng)然,你也可以用一個(gè)星號(hào)(*)來表示上面提到的所有平臺(tái)。 其余的參數(shù),可以按照任何順序出現(xiàn),并且可以添加關(guān)于聲明生命周期的附加信息,包括重要事件。

  • unavailable 參數(shù)表示該聲明在指定的平臺(tái)上是無效的。
  • introduced 參數(shù)表示指定平臺(tái)從哪一版本開始引入該聲明。格式如下:

introduced=版本號(hào)

版本號(hào)由一個(gè)或多個(gè)正整數(shù)構(gòu)成,由句點(diǎn)分隔的。

  • deprecated 參數(shù)表示指定平臺(tái)從哪一版本開始棄用該聲明。格式如下:

deprecated=版本號(hào)

可選的版本號(hào)由一個(gè)或多個(gè)正整數(shù)構(gòu)成,由句點(diǎn)分隔的。省略版本號(hào)表示該聲明目前已棄用,當(dāng)棄用出現(xiàn)時(shí)無需給出任何有關(guān)信息。如果你省略了版本號(hào),冒號(hào)(:)也可省略。

  • obsoleted 參數(shù)表示指定平臺(tái)從哪一版本開始廢棄該聲明。當(dāng)一個(gè)聲明被廢棄后,它就從平臺(tái)中移除,不能再被使用。格式如下:

obsoleted=版本號(hào)

版本號(hào)由一個(gè)或多個(gè)正整數(shù)構(gòu)成,由句點(diǎn)分隔的。

  • message 參數(shù)用來提供文本信息。當(dāng)使用被棄用或者被廢棄的聲明時(shí),編譯器會(huì)拋出警告或錯(cuò)誤信息。格式如下:

message=信息內(nèi)容

信息內(nèi)容由一個(gè)字符串構(gòu)成。

  • renamed 參數(shù)用來提供文本信息,用以表示被重命名的聲明的新名字。當(dāng)使用聲明的舊名字時(shí),編譯器會(huì)報(bào)錯(cuò)提示新名字。格式如下:

renamed=新名字

新名字由一個(gè)字符串構(gòu)成。

你可以將 renamed 參數(shù)和 unavailable 參數(shù)以及類型別名聲明組合使用,以此向用戶表示某個(gè)聲明已經(jīng)被重命名。當(dāng)某個(gè)聲明的名字在一個(gè)框架或者庫(kù)的不同發(fā)布版本間發(fā)生變化時(shí),這會(huì)相當(dāng)有用。

// 首發(fā)版本
protocol MyProtocol {
// 這里是協(xié)議定義
}
// 后續(xù)版本重命名了 MyProtocol
protocol MyRenamedProtocol {
// 這里是協(xié)議定義
}
@available(*, unavailable, renamed:"MyRenamedProtocol")
typealias MyProtocol = MyRenamedProtocol

你可以在某個(gè)聲明上使用多個(gè) available 特性,以指定該聲明在不同平臺(tái)上的可用性。編譯器只有在當(dāng)前目標(biāo)平臺(tái)和 available 特性中指定的平臺(tái)匹配時(shí),才會(huì)使用 available 特性。

如果 available 特性除了平臺(tái)名稱參數(shù)外,只指定了一個(gè) introduced 參數(shù),那么可以使用以下簡(jiǎn)寫語法代替:

@available(平臺(tái)名稱 版本號(hào),*)

available 特性的簡(jiǎn)寫語法可以簡(jiǎn)明地表達(dá)出聲明在多個(gè)平臺(tái)上的可用性。盡管這兩種形式在功能上是相同的,但請(qǐng)盡可能地使用簡(jiǎn)寫語法形式。

@available(iOS 10.0, macOS 10.12, *)
class MyClass {
// 這里是類定義
}

discardableResult

該特性用于的函數(shù)或方法聲明,以抑制編譯器中 函數(shù)或方法的返回值被調(diào)而沒有使用其結(jié)果的警告。

GKInspectable

應(yīng)用此屬性,暴露一個(gè)自定義 GameplayKit 組件屬性給 SpriteKit 編輯器 UI。

objc

該特性用于修飾任何可以在 Objective-C 中表示的聲明。比如,非嵌套類、協(xié)議、非泛型枚舉(僅限原始值為整型的枚舉)、類和協(xié)議中的屬性和方法(包括存取方法)、構(gòu)造器、析構(gòu)器以及下標(biāo)運(yùn)算符。objc 特性告訴編譯器這個(gè)聲明可以在 Objective-C 代碼中使用。

標(biāo)有 objc 特性的類必須繼承自 Objective-C 中定義的類。如果你將 objc 特性應(yīng)用于一個(gè)類或協(xié)議,它也會(huì)隱式地應(yīng)用于類或協(xié)議中兼容 Objective-C 的成員。對(duì)于標(biāo)記了 objc 特性的類,編譯器會(huì)隱式地為它的子類添加 objc 特性。標(biāo)記了 objc 特性的協(xié)議不能繼承沒有標(biāo)記 objc 的協(xié)議。

如果你將 objc 特性應(yīng)用于枚舉,每一個(gè)枚舉用例都會(huì)以枚舉名稱和用例名稱組合的方式暴露在 Objective-C 代碼中。例如,在 Planet 枚舉中有一個(gè)名為 Venus 的用例,該用例暴露在 Objective-C 代碼中時(shí)叫做 PlanetVenus。

objc 特性有一個(gè)可選的參數(shù),由標(biāo)識(shí)符構(gòu)成。當(dāng)你想把 objc 所修飾的實(shí)體以一個(gè)不同的名字暴露給 Objective-C 時(shí),你就可以使用這個(gè)特性參數(shù)。你可以使用這個(gè)參數(shù)來命名類、枚舉類型、枚舉用例、協(xié)議、方法、存取方法以及構(gòu)造器。下面的例子把 ExampleClass 中的 enabled 屬性的取值方法暴露給 Objective-C,名字是 isEnabled,而不是它原來的屬性名。

@objc
class ExampleClass: NSObject {
var enabled: Bool {
@objc(isEnabled) get {
// 返回適當(dāng)?shù)闹?       }
}
}

nonobjc

該特性用于方法、屬性、下標(biāo)、或構(gòu)造器的聲明,這些聲明本可以在 Objective-C 代碼中使用,而使用 nonobjc 特性則告訴編譯器這個(gè)聲明不能在 Objective-C 代碼中使用。

可以使用 nonobjc 特性解決標(biāo)有 objc 的類中橋接方法的循環(huán)問題,該特性還允許對(duì)標(biāo)有 objc 的類中的構(gòu)造器和方法進(jìn)行重載。

標(biāo)有 nonobjc 特性的方法不能重寫標(biāo)有 objc 特性的方法。然而,標(biāo)有 objc 特性的方法可以重寫標(biāo)有 nonobjc 特性的方法。同樣,標(biāo)有 nonobjc 特性的方法不能滿足標(biāo)有 @objc 特性的協(xié)議中的方法要求。

NSApplicationMain

在類上使用該特性表示該類是應(yīng)用程序委托類,使用該特性與調(diào)用 NSApplicationMain(_:_:) 函數(shù)并且把該類的名字作為委托類的名字傳遞給函數(shù)的效果相同。

如果你不想使用這個(gè)特性,可以提供一個(gè) main.swift 文件,并在代碼頂層調(diào)用 NSApplicationMain(_:_:) 函數(shù),如下所示:

import AppKit
NSApplicationMain(CommandLine.argc, CommandLine.unsafeArgv)

NSCopying

該特性用于修飾一個(gè)類的存儲(chǔ)型變量屬性。該特性將使屬性的設(shè)值方法使用傳入值的副本進(jìn)行賦值,這個(gè)值由傳入值的 copyWithZone(_:) 方法返回。該屬性的類型必需符合 NSCopying 協(xié)議。

NSCopying 特性的行為與 Objective-C 中的 copy 特性相似。

NSManaged

該特性用于修飾 NSManagedObject 子類中的實(shí)例方法或存儲(chǔ)型變量屬性,表明它們的實(shí)現(xiàn)由 Core Data 在運(yùn)行時(shí)基于相關(guān)實(shí)體描述動(dòng)態(tài)提供。對(duì)于標(biāo)記了 NSManaged 特性的屬性,Core Data 也會(huì)在運(yùn)行時(shí)為其提供存儲(chǔ)。應(yīng)用這個(gè)特性也意味著 objc 特性。

testable

在導(dǎo)入允許測(cè)試的編譯模塊時(shí),該特性用于修飾 import 聲明,這樣就能訪問被導(dǎo)入模塊中的任何標(biāo)有 internal 訪問級(jí)別修飾符的實(shí)體,猶如它們被標(biāo)記了 public 訪問級(jí)別修飾符。測(cè)試也可以訪問使用 internal 或者 public 訪問級(jí)別修飾符標(biāo)記的類和類成員,就像它們是 open 訪問修飾符聲明的。

UIApplicationMain

在類上使用該特性表示該類是應(yīng)用程序委托類,使用該特性與調(diào)用 UIApplicationMain 函數(shù)并且把該類的名字作為委托類的名字傳遞給函數(shù)的效果相同。

如果你不想使用這個(gè)特性,可以提供一個(gè) main.swift 文件,并在代碼頂層調(diào)用 UIApplicationMain(_:_:_:) 函數(shù)。比如,如果你的應(yīng)用程序使用一個(gè)繼承于 UIApplication 的自定義子類作為主要類,你可以調(diào)用 UIApplicationMain(_:_:_:) 函數(shù)而不是使用該特性。

Interface Builder 使用的聲明特性

Interface Builder 特性是 Interface Builder 用來與 Xcode 同步的聲明特性。Swift 提供了以下的 Interface Builder 特性:IBActionIBOutlet,IBDesignable,以及 IBInspectable 。這些特性與 Objective-C 中對(duì)應(yīng)的特性在概念上是相同的。

IBOutletIBInspectable 用于修飾一個(gè)類的屬性聲明,IBAction 特性用于修飾一個(gè)類的方法聲明,IBDesignable 用于修飾類的聲明。

IBActionIBOutlet 特性都意味著 objc 特性。

類型特性

類型特性只能用于修飾類型。

autoclosure

這個(gè)特性通過把表達(dá)式自動(dòng)封裝成無參數(shù)的閉包來延遲表達(dá)式的計(jì)算。它可以修飾類型為返回表達(dá)式結(jié)果類型的無參數(shù)函數(shù)類型的函數(shù)參數(shù)。關(guān)于如何使用 autoclosure 特性的例子,請(qǐng)參閱 自動(dòng)閉包函數(shù)類型。

convention 該特性用于修飾函數(shù)類型,它指出了函數(shù)調(diào)用的約定。

convention 特性總是與下面的參數(shù)之一一起出現(xiàn)。

  • swift 參數(shù)用于表示一個(gè) Swift 函數(shù)引用。這是 Swift 中函數(shù)值的標(biāo)準(zhǔn)調(diào)用約定。

  • block 參數(shù)用于表示一個(gè) Objective-C 兼容的塊引用。函數(shù)值會(huì)作為一個(gè)塊對(duì)象的引用,塊是一種 id 兼容的 Objective-C 對(duì)象,其中嵌入了調(diào)用函數(shù)。調(diào)用函數(shù)使用 C 的調(diào)用約定。

  • c 參數(shù)用于表示一個(gè) C 函數(shù)引用。函數(shù)值沒有上下文,不具備捕獲功能,同樣使用 C 的調(diào)用約定。

使用 C 函數(shù)調(diào)用約定的函數(shù)也可用作使用 Objective-C 塊調(diào)用約定的函數(shù),同時(shí)使用 Objective-C 塊調(diào)用約定的函數(shù)也可用作使用 Swift 函數(shù)調(diào)用約定的函數(shù)。然而,只有非泛型的全局函數(shù)、局部函數(shù)以及未捕獲任何局部變量的閉包,才可以被用作使用 C 函數(shù)調(diào)用約定的函數(shù)。

escaping 在函數(shù)或者方法聲明上使用該特性,它表示參數(shù)將不會(huì)被存儲(chǔ)以供延遲執(zhí)行,這將確保參數(shù)不會(huì)超出函數(shù)調(diào)用的生命周期。在使用 escaping 聲明特性的函數(shù)類型中訪問屬性和方法時(shí)不需要顯式地使用 self.。關(guān)于如何使用 escaping 特性的例子,請(qǐng)參閱 逃逸閉包。

特性語法

特性 → @ 特性名 特性參數(shù)子句可選 特性名標(biāo)識(shí)符 特性參數(shù)子句 → ( 均衡令牌列表可選 ) 特性列表特性 特性列表可選

均衡令牌列表均衡令牌 均衡令牌列表可選 均衡令牌 → ( 均衡令牌列表可選 ) 均衡令牌 → [ 均衡令牌列表可選 ] 均衡令牌 → { 均衡令牌列表可選} 均衡令牌 → 任意標(biāo)識(shí)符,關(guān)鍵字,字面量或運(yùn)算符 均衡令牌 → 任意標(biāo)點(diǎn)除了 (,),[,],{,或 }