Edited at

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

More than 5 years have passed since last update.

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


Optional型に関する改良


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


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



  • Optionalは(以前はLogicValueと命名されていた)BooleanType準拠ではなくなりました。今後はvariable != nilと明示する必要があります。



    • ImplicitlyUnwrappedOptionalにはまだBooleanTypeの属性が残されています。今後取り除かれる予定です。



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


var x: Int! = 0 

x! = 2
x!++

// 入れ子の辞書も直接変更を加えることが可能に

var sequences = ["fibonacci": [1, 1, 2, 3, 0]]
sequences["fibonacci"]![4] = 5
sequences["fibonacci"]!.append(8)



  • ?チェインも通し代入が可能となりました。

sequences["fibonacci"]?.append(0) 

sequences["fibonacci"]?[6] = 13
sequences["perfect"]?[0] = 6 // ["perfect"]は存在しないため代入はおこらない



  • ??二項演算子が導入されました。||&&同様、ショートサーキットします。左辺がnilでなければ左辺の値、nilであれば右辺の値となります。

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


標準ライブラリー


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


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


  • UnsafeArrayUnsafeMutableArray はそれぞれ UnsafeBufferPointerUnsafeMutableBufferPointer に改名されました。


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



Dynamic修飾子(declaration modifier)

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

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は削除されました。


  • +=演算子は、配列に対して用いた場合、連結のみを意味するようになりました。要素の追加はできません。これによりAnyAnyObjectにおける曖昧さが解消されました。


Swift Command Line Interface


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


  • -Ofast-Ouncheckedに改名されました。


その他


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


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



Release Note に未記載



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

Before:

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

After:

typealias IntInt = (Int, Int)

let (hi, lo) = unsafeBitCast(closure, IntInt.self)


感想

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

Dan.the.Swift.Newbie