Swift - Attributes(@attribute) について 【編集中】


クラスやメソッドの宣言に公式リファレンスでも良く出てくるAttributesについてわからなかったので調べてみました。
ちょこちょこ書いていくつもりです。


# Attributesとは
attributeは宣言や型の詳細情報を提供するもので、定義は以下の2種類があります。

```swift:attribute
@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

その宣言が指定されたプラットフォームで利用できないことを示します。

```swift:availability_unavailable
@available(iOS, unavailable)
func someMethod() {
    // iOS8.0では利用できないメソッド
}
```

### introduced=`version number`

その宣言がこの引数で示したプラットフォームのバージョン以降で導入されたことを示します。
`version number`は正の整数または、浮動小数点数で構成されます。

```swift:availability_introduced
@available(iOS, introduced=8.0)
func someMethod() {
    // iOS8.0から導入されたメソッド
}
```

### deprecated=`version number`

その宣言がこの引数で示したプラットフォームのバージョン以降で非推奨であることを示します。
非推奨なので絶対に使えないというわけではありませんが、今後のバージョンで削除される可能性があります。
`version number`は正の整数または、浮動小数点数で構成されます。

```swift:availability_deprecated
@available(iOS, deprecated=8.0)
func someMethod() {
    // iOS8.0から非推奨になったメソッド
}
```

### obsoleted=`version number`

その宣言がこの引数で示したプラットフォームのバージョン以降で廃止されたことを示します。
廃止されると、そのバージョンからはその宣言を使用できなくなります。
`version number`は正の整数または、浮動小数点数で構成されます。

```swift:availability_obsoleted
@available(iOS, obsoleted=8.0)
func someMethod() {
    // iOS8.0から廃止されたメソッド
}
```

### message=`message`

非推奨または廃止宣言の使用に関する警告やエラーを出すときに、コンパイラによって表示されるテキストメッセージを提供するために使用されます。
`message`は文字列リテラルです。

```swift:availability_message
@available(iOS, obsoleted=8.0, message="obsoleted")
func someMethod() {
    // iOS8.0から廃止されたメソッド
}
```

なお、introduced, deprecated, obsoleted, message引数は組み合わせて利用できます。

```swift:example
@available(iOS, introduced=3.0, deprecated=7.0, obsoleted=8.0, message="obsoleted")
func someMethod() {
    // iOS3.0から導入、7.0で非推奨、8.0で廃止されたメソッド
}
```

### renamed=`new name`

こちらは、名前が変更されている宣言の新しい名前を提供するために使用されます。
名前を変更した宣言の使用に関するエラーを発するときに、新しい名前がコンパイラによって表示されます。

```swift:availability_renamed
@available(iOS, obsoleted=7.0, renamed="NewClass")
class SomeClass {
    // 7.0で廃止、名前が変更になったクラス
}

@availability(iOS, introduced=7.0)
class NewClass {
    // iOS7.0からSomeClassに代わり、導入されたクラス
}
```

## autoclosure
この属性は、「引数を取らず式の評価値を返す関数オブジェクト」を引数に取る関数のそのパラメータ宣言に適用できます。
`@autoclosure`属性のパラメータは、使用時に式を自動的にクロージャにラップしてくれて、式の評価のタイミングを遅らせることができます。

要するに、autoclosure属性の引数の型は、実際には関数オブジェクトですが、
使用する側から見ると、その評価値の型にみえます。そして、自動的にクロージャにラップされます。

```swift: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`を明示的に宣言しなくて良くなります。

```swift:noescape
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`属性のメソッドです。


```swift:noreturn
func someMethod() {
    success() // success!, ここでプログラム終了
	// 返ってこないので以降は実行されない
}

@noreturn func success() {
	println("success!")
	exit(EXIT_SUCCESS)
}
    
```
## NSApplicationMain

## NSCopying

## objc

## UIApplicationMain

## inline

## IBAction

## IBOutlet

## IBDesignable

## IBInspectable


# 参考
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Attributes.html