Swift - Xcode 6 Beta 5 における変更点

DLに時間がかかっているので待ち時間の手慰みに。

* [Xcode 6 beta 5 Release Notes]

[Xcode 6 beta 5 Release Notes]: https://developer.apple.com/devcenter/download.action?path=/Developer_Tools/xcode_6_beta_5_za4gu6/xcode_6_beta_5_release_notes.pdf

## Optional型に関する改良

* `UIView`, `NSView`, `UIFont`, そして `UIApplicationDelegate` の optional 準拠が向上し、 implicitly unwrapped optionals がほぼ取り除かれました

* `Optional`は`Equatable`プロトコル準拠でなくても`==`ないし`==`で`nil`との比較ができるようになりました

* `Optional`は(以前は`LogicValue`と命名されていた)`BooleanType`準拠ではなくなりました。今後は`variable != nil`と明示する必要があります。
  * `ImplicitlyUnwrappedOptional`にはまだ`BooleanType`の属性が残されています。今後取り除かれる予定です。

* `x!`を通して代入ができるようになりました。

````swift
var x: Int! = 0 
x! = 2 
x!++
````

````swift
// 入れ子の辞書も直接変更を加えることが可能に
var sequences = ["fibonacci": [1, 1, 2, 3, 0]] 
sequences["fibonacci"]![4] = 5 
sequences["fibonacci"]!.append(8)
````
* `?`チェインも通し代入が可能となりました。

````swift
sequences["fibonacci"]?.append(0) 
sequences["fibonacci"]?[6] = 13 
sequences["perfect"]?[0] = 6 // ["perfect"]は存在しないため代入はおこらない
````
* `??`二項演算子が導入されました。`||`や`&&`同様、ショートサーキットします。左辺が`nil`でなければ左辺の値、`nil`であれば右辺の値となります。

````swift
var myArray: [Int] = []
print(myArray.first ?? 0) // myArray.first が nil なので 0
myArray.append(22)
print(myArray.first ?? 0) // myArray.first が 22 なので 22
````

## SwiftにおけるRange

Rangeの概念は、次に三つに整理統合されました。

1.`ForwardIndexType`の集まりとしてのRange。スライスや反復で用いられます。
2.`Comparable`な値に対する区間として。ある値がその区間内にあるかは`~=`演算子で確認できます。
3.`Comparable`でもある`Strideable`な値に対するストライドとして。任意の区間にO(1)で到達できます。

`startIndex`に対する増分で`endIndex`に到達できないRangeはエラーとなります。`startIndex`より小さな`endIndex`も。Swiftはこのような場合を検出した時点で、エラーをトラップします。

````
1> 1...0
! fatal error: Can't form Range with end < start
````

区間は二種類の総称型により生成できます。`..<`演算子によって生成される`HalfOpenInterval<T>`型と`...`演算子によって生成される`ClosedInterval<T>`です。

````
1> 3.14..<12
      $R0: HalfOpenInterval<Double> = {
        _start = 3.1400000000000001
_end = 12 }
2> 22...99.1
````

## 標準ライブラリー

* いくつかのプロトコルが改名されました。特筆すべきものには、`LogicValue`が`BooleanValue`になったことがあげられます。

* イミュータブルプログラミングの促進とCocoaとの整合性向上のため、` UnsafeConstPointer` と `UnsafePointer` はそれぞれ`UnsafePointer` と `UnsafeMutablePointer` に改名されました。

* `UnsafeArray` と `UnsafeMutableArray` はそれぞれ `UnsafeBufferPointer` と `UnsafeMutableBufferPointer` に改名されました。

* `Array`インスタンスに`.first`および`.last`プロパティが追加されました。

## `Dynamic`修飾子(declaration modifier)

`dynamic`修飾子が、`@objc`とは直交的な概念として導入されました。

````swift
final class Foo : SomeBaseClass {
  // 常に objc_msgSend でアクセスされる
  // finalクラス中でもswizzle可能
  // (原文ママ。@objcと逆だと思われるのだが…)
  dynamic var x: Int
  // ObjCからは objc_msgSend でアクセスされるが、
  // Swiftからはより効率的手段でアクセスされる可能性がある
  // (原文ママ。dynamicと逆だと思われるのだが…)
  @objc var y: Int
  // SomeBaseClass がObjectve-Cクラスまたは派生クラスの場合
  // ObjCから見える。
  var z: Int
}
````

`dynamic`キーワードにより、KVOやproxyingをはじめとする高度なCocoaの機能がSwiftで利用可能となります。本機能は`@objc`属性とは独立したものですが、現時点における実装ではいまだObjective-Cランタイムに細部を依存しているため、`dynamic`修飾子はObjective-C互換な型でのみ機能します。

## 演算子および属性の変更点

* `@auto_closure`は`@autoclosure`に改名されました
* `@assignment`属性は削除されました(不要ということ)。
*  `@prefix`, `@infix`, および `@postfix`　は宣言変更子( declaration modifiers)へと変更されました。これに伴い先頭の`@`は不要となりました。
*  演算子宣言も`operator prefix - {}`から`prefix operator - {}`に変更されました。
  * `@infix func +++`の`@infix`は不要になりました(*弾確認。引数の数を見て判定されるようになったのかな…*)
* `@class_protocol`は削除されました。
* `+=`演算子は、配列に対して用いた場合、連結のみを意味するようになりました。要素の追加はできません。これにより`Any`や`AnyObject`における曖昧さが解消されました。

## Swift Command Line Interface

* コンパイラー名が`swiftc`になりました。`swift`はスクリプトとして実行する場合に用います。`xcrun swift myscript.swift`は以前の` xcrun swift -i myscript.swift`と同じ意味となります。
* `-Ofast` は `-Ounchecked`に改名されました。

## その他

* クラスまたは`@objc`プロトコルを要素とする配列(に|から)`a as [C]`でキャストする際には、型の検証は実際にそれがアクセスされる時点まで遅延されるようになりました。これにより`Array`と`NSArray`の相互変換の一部がO(n)ではなくO(1)となります。

* /** および /// は文書コメントとして解釈されます。Swiftは`reStructuredText`を採用しています。現時点ではブロックレベルのマークアップのみをサポートしています。関数やメソッドのパラメターに注釈を加えるには`:param:`に続いて注釈を、戻り値に注釈を加えるには`:returns:`に続いて注釈をそれぞれ記入してください。

## Release Note に未記載

* `reinterpretCast()`がなくなりました。代わりに`unsafeBitCast()`が用意されました。

Before:

````swift
let (hi, lo):(Int, Int) = reinterpretCast(closure)
````

After:

````swift
typealias IntInt = (Int, Int)
let (hi, lo) = unsafeBitCast(closure, IntInt.self)
````

## 感想

うわわ、結構多いなあ。特に演算子まわり…

Dan.the.Swift.Newbie