DLに時間がかかっているので待ち時間の手慰みに。
Optional型に関する改良
-
UIView
,NSView
,UIFont
, そしてUIApplicationDelegate
の optional 準拠が向上し、 implicitly unwrapped optionals がほぼ取り除かれました -
Optional
はEquatable
プロトコル準拠でなくても==
ないし==
で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
標準ライブラリー
-
いくつかのプロトコルが改名されました。特筆すべきものには、
LogicValue
がBooleanValue
になったことがあげられます。 -
イミュータブルプログラミングの促進とCocoaとの整合性向上のため、
UnsafeConstPointer
とUnsafePointer
はそれぞれUnsafePointer
とUnsafeMutablePointer
に改名されました。 -
UnsafeArray
とUnsafeMutableArray
はそれぞれUnsafeBufferPointer
とUnsafeMutableBufferPointer
に改名されました。 -
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
は削除されました。 -
+=
演算子は、配列に対して用いた場合、連結のみを意味するようになりました。要素の追加はできません。これにより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:
let (hi, lo):(Int, Int) = reinterpretCast(closure)
After:
typealias IntInt = (Int, Int)
let (hi, lo) = unsafeBitCast(closure, IntInt.self)
感想
うわわ、結構多いなあ。特に演算子まわり…
Dan.the.Swift.Newbie