Xcode
iOS
プログラミング
Swift

Swift 1.2 で個人的に気になったところまとめ

More than 3 years have passed since last update.


Swift 1.2

本日、Xcode6.3とiOS beta 8.3とともに、Swift 1.2発表されました。

Swift 1.2 ではコンパイラの強化や言語仕様の変更などが行われています。

その中でも気になった言語仕様の変更点をいくつかあげてみました。


letの強化


1.let条件分岐の宣言ができるように

以前では、条件によって初期化する際はvarを使わなければならなければなりませんでした。その後、変更がないにもかかわらずvarを使わなければならないのはletvarの概念に当てはまらないものでした。

//以前の書き方

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

※この記事は一部分を削除し再投稿された記事です。