Swift 1.2
本日、Xcode6.3とiOS beta 8.3とともに、Swift 1.2発表されました。
Swift 1.2 ではコンパイラの強化や言語仕様の変更などが行われています。
その中でも気になった言語仕様の変更点をいくつかあげてみました。
letの強化
1.let
条件分岐の宣言ができるように
以前では、条件によって初期化する際はvar
を使わなければならなければなりませんでした。その後、変更がないにもかかわらずvar
を使わなければならないのはlet
とvar
の概念に当てはまらないものでした。
//以前の書き方
var x: SomeThing
if condition {
x = foo()
} else {
x = bar()
}
// このあと変更はないことを保証したいが、varで宣言しなければならない。
// できればxには代入などされたくない
use(x)
// Swift 1.2
let x: SomeThing
if condition {
x = foo()
} else {
x = bar()
}
// xの評価や実行が実行される前に、すべての条件が網羅されていればletで宣言できる
// letで宣言できることによって変更がないことが保証できる
use(x)
2.if let
の複数宣言に対応
if let
で宣言するオブジェクトがnil
ではなかったときに{...}
が実行されるものでしたが、以前ではひとつしか宣言出来なく、複数のnil
チェックをする場合は冗長になってしまっていました。
// 以前の書き方
if object.a != nil && object.b != nil && object.c != nil {
let a = object.a!
let b = object.b!
let c = object.c!
doSomething1(a, b, c)
doSomething2(a, b, c)
doSomething3(a, b, c)
}
// Swift 1.2
if let a = object.a, b = object.b, c = object.c {
doSomething1(a, b, c)
doSomething2(a, b, c)
doSomething3(a, b, c)
}
staticが使えるように
以前では、クラス内メソッドではstatic
宣言が使えなかっためstruct
構造体のインスタンスとしてstatic宣言を使用していた。そのためシングルトンの実装部分などで、突然意味不明なstruct
宣言をしなければならなかった。
// 以前の書き方
class SomeObject: NSObject {
// Singleton
class var sharedInstance : SomeObject {
// 突然意味不明な呪文を唱え始める
struct Singleton {
static let instance = SomeObject()
}
// 呪文ここまで
return Singleton.instance
}
}
Swift 1.2 ではメソッドのプロパティにstatic宣言を使用できる
// Swift 1.2
class A: NSObject {
// Singleton
static var sharedInstance = A()
}
Objective-C で Swift のオプショナル型を指定できるように
*-Bridging-Header.h
でインポートしていた Objective-C のソースコードは Swift のオプショナル型に対応していなかったため、静的解析が全く役立たない状況でした。
Objective-C で指定
// プロパティでの指定
@property (nonatomic, readwrite, retain, nullable) UIView *backgroundView;
// メソッドでの指定
-(void)registerNib:(nonnull UINib *)nib forCellReuseIdentifier:(nonnull NSString *)identifier;
-(nullable UITableViewCell *)cellForRowAtIndexPath:(nonnull NSIndexPath)indexPath;
Swift での見え方
// プロパティ
var backgroundView: UIView?
// メソッド
func registerNib(nib: UINib, forCellReuseIdentifier identifier: String)
func cellForRowAtIndexPath(indexPath: NSIndexPath) -> UITableViewCell?
Objective-C のオープンソースライブラリがオプショナル型の指定をするようになれば、 Swift の強力な静的解析がさらに有効活用できるようになります。
この仕組みの導入は、 Swift に移行できていないプロジェクトに対して、それを促すとても効果的な方法です。
まとめ
Swiftで開発している開発者にとってかなり大幅なアップデートだと感じました。
今回のバージョンアップのように、Swiftのメリットである強力な静的解析がより有効活用できるようになれば、開発をよりスムーズ進められると思われます。
今後もあるであろうアップデートがとても楽しみになりました。
参考
Swift 1.2 and Xcode 6.3 beta
https://developer.apple.com/swift/blog/?id=22
※この記事は一部分を削除し再投稿された記事です。