クラスやメソッドの宣言に公式リファレンスでも良く出てくるAttributesについてわからなかったので調べてみました。
ちょこちょこ書いていくつもりです。
Attributesとは
attributeは宣言や型の詳細情報を提供するもので、定義は以下の2種類があります。
@attribute_name // 引数無し
@attribute_name(arguments) // 引数あり
では、順番に見ていきましょう
available (availability)
この属性は有効なプラットフォームやOSを宣言します。
Xcode7(Swift 2.0) から
available
に変更されました。
@available
属性は、必ず、カンマで区切られた2つ以上の引数とともに使用されます。
第一引数は、 iOS, iOSApplicationExtension, OSX, OSXApplicationExtension
のいずれかのプラットフォーム名で始まります。
Xcode7(Swift 2.0) から上記に加えて、
watchOS, watchOSApplicationExtension
が追加されています。
Swift 2.1 からは
tvOS, tvOSApplicationExtension
も追加されるっぽい?
また、上記のプラットフォームすべてを表すにはアスタリスク*
が使用できます。
残りの引数は任意の順序で指定し、宣言の追加情報を指定できます。
unavailable
その宣言が指定されたプラットフォームで利用できないことを示します。
@available(iOS, unavailable)
func someMethod() {
// iOS8.0では利用できないメソッド
}
introduced=version number
その宣言がこの引数で示したプラットフォームのバージョン以降で導入されたことを示します。
version number
は正の整数または、浮動小数点数で構成されます。
@available(iOS, introduced=8.0)
func someMethod() {
// iOS8.0から導入されたメソッド
}
deprecated=version number
その宣言がこの引数で示したプラットフォームのバージョン以降で非推奨であることを示します。
非推奨なので絶対に使えないというわけではありませんが、今後のバージョンで削除される可能性があります。
version number
は正の整数または、浮動小数点数で構成されます。
@available(iOS, deprecated=8.0)
func someMethod() {
// iOS8.0から非推奨になったメソッド
}
obsoleted=version number
その宣言がこの引数で示したプラットフォームのバージョン以降で廃止されたことを示します。
廃止されると、そのバージョンからはその宣言を使用できなくなります。
version number
は正の整数または、浮動小数点数で構成されます。
@available(iOS, obsoleted=8.0)
func someMethod() {
// iOS8.0から廃止されたメソッド
}
message=message
非推奨または廃止宣言の使用に関する警告やエラーを出すときに、コンパイラによって表示されるテキストメッセージを提供するために使用されます。
message
は文字列リテラルです。
@available(iOS, obsoleted=8.0, message="obsoleted")
func someMethod() {
// iOS8.0から廃止されたメソッド
}
なお、introduced, deprecated, obsoleted, message引数は組み合わせて利用できます。
@available(iOS, introduced=3.0, deprecated=7.0, obsoleted=8.0, message="obsoleted")
func someMethod() {
// iOS3.0から導入、7.0で非推奨、8.0で廃止されたメソッド
}
renamed=new name
こちらは、名前が変更されている宣言の新しい名前を提供するために使用されます。
名前を変更した宣言の使用に関するエラーを発するときに、新しい名前がコンパイラによって表示されます。
@available(iOS, obsoleted=7.0, renamed="NewClass")
class SomeClass {
// 7.0で廃止、名前が変更になったクラス
}
@availability(iOS, introduced=7.0)
class NewClass {
// iOS7.0からSomeClassに代わり、導入されたクラス
}
autoclosure
この属性は、「引数を取らず式の評価値を返す関数オブジェクト」を引数に取る関数のそのパラメータ宣言に適用できます。
@autoclosure
属性のパラメータは、使用時に式を自動的にクロージャにラップしてくれて、式の評価のタイミングを遅らせることができます。
要するに、autoclosure属性の引数の型は、実際には関数オブジェクトですが、
使用する側から見ると、その評価値の型にみえます。そして、自動的にクロージャにラップされます。
func assert(message:String, @autoclosure ifTrue:()->Bool){
if ifTrue() {
println(message)
}
}
func someMethod() {
let value = 5
assert("value is positive number", ifTrue: value > 0) // value is positive number
}
noescape
この属性は、関数オブジェクトを引数に取る関数のそのパラメータ宣言に適用できます。
@noescape
属性のパラメータは、メソッドのスコープよりもパラメータの関数オブジェクトのライフサイクルは長くないことを保証します。
つまり、このパラメータが同期的に呼び出され、関数のスコープ外で呼び出されないことを保証します。
とある関数のハンドラで、self
のインスタンスにアクセスするとき、@noescape
属性でハンドラが関数のスコープ外で呼び出されないことを保証された場合はself
を明示的に宣言しなくて良くなります。
func someMethod(@noescape handler: Void -> Void) {
// handlerは同期的に呼び出される
handler()
}
class SomeClass {
let message = "SomeClass message"
func someTask() {
someMethod {
// `self` を明示的に宣言しなくて良くなる。
let msg = message
println(msg) // SomeClass message
}
}
}
noreturn
この属性が付いた関数はその名の通り何も返さないことを示します。
オーバーライドは可能ですが、オーバーライドしたものもnoreturnでなければいけません。
代表的なものでは、exit()
やabort()
が@noreturn
属性のメソッドです。
func someMethod() {
success() // success!, ここでプログラム終了
// 返ってこないので以降は実行されない
}
@noreturn func success() {
println("success!")
exit(EXIT_SUCCESS)
}
NSApplicationMain
NSCopying
objc
UIApplicationMain
inline
IBAction
IBOutlet
IBDesignable
IBInspectable
参考