連載
» 2016年09月08日 05時00分 公開

2Dゲームを例にSwift 2からSwift 3への変更点と移行のポイントを見るiOS SDKとSwiftで始めるゲーム作成入門(終)(2/2 ページ)

[杉本裕樹,マネーフォワード]
前のページへ 1|2       

Swift 3.0での変更点の例をコードで見ていく

 前項までタワーディフェンスをSwift 3.0に対応させる方法を紹介してきました。次はSwift 3.0での変更点を見ていきます。

標準ライブラリのAPIの変更点

 冒頭でも少しお話しした通り、今回は多くの標準ライブラリのメソッド名が変更されました。対応は大変ですが、全体的に、冗長なメソッド名が短くなったので、開発効率の向上が見込めそうです。

 タワーディフェンスアプリで使っているメソッドでは「presentViewController」「runAction」がそれぞれ「present」「run」に変更されていました。

RPScreenRecorder.shared().stopRecording { viewController, error in
    viewController?.previewControllerDelegate = self
    rootViewController?.present(viewController!, animated: true, completion: nil)
    // ↓ Swift2.x
    // rootViewController?.presentViewController(viewController!, animated: true, completion: nil)
}
 
enemy.run(SKAction.sequence(actions))
// ↓ Swift2.x
// enemy.runAction(SKAction.sequence(actions))

 他には名前の一部がラベルになったものもあります。タワーディフェンスアプリでは「moveTo」や「updateWithDeltaTime」が「move」と「update」に置き換えられました。

SKAction.move(to: CGPoint(x: Double(p.x), y: Double(p.y)), duration: duration)
// ↓ Swift2.x
// SKAction.moveTo(CGPoint(x: Double(p.x), y: Double(p.y)), duration: duration)
 
char.stateMachine.update(withDeltaTime: currentTime)
// ↓ Swift2.x
// char.stateMachine.updateWithDeltaTime(currentTime)

メソッドの第1引数のラベル

 他にメソッドについて変わったところとしては、第1引数のラベルの扱いがあります。今まではメソッド呼び出し時に第1引数のラベルを省略できましたが、Swift 3.0からは省略できなくなりました。

 以下のように今までなら省略できていた第1引数が必須になったのです。

MyClass().print(num: 1)
// Swift2.x
// MyClass().print(1)
 
class MyClass {
    func print(num: Int) {
        print(num)
    }
}

 今まで通り第1引数のラベルを省略したい場合は引数の先頭に「 _ 」を付けます。

class MyClass {
    func print(_ num: Int) {
        print(num)
    }
}

 Swift 3.0への自動変換ツールを使うと、メソッドを今まで通り呼べるように全体的に「 _ 」が付きました。

func enemiesCloseToPoint(_ point: CGPoint, distance: Double) -> [Enemy] {
//    省略
}
// ↓ Swift2.x
// func enemiesCloseToPoint(point: CGPoint, distance: Double) -> [Enemy] {
//     省略
// }

 他にもAppDelegateやUIViewControllerのメソッドも第1引数の先頭に「 _ 」が付くようになりました。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
    return true
}
 
// ↓ Swift2.x
// func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
//     // Override point for customization after application launch.
//     return true
// }

Foundationの変更点

 前項までメソッドの変更点を取り上げてきましたが、クラスや構造体についても変更があります。特に変わったのがFoundationのクラスで、今までは先頭にNSプレフィックスが付いていたのですがNSの付かない型が作られました。

 例えば「NSDate」「NSURL」「NSData」などが該当します。

var enteredDate = Date()
// Swift2.x
// var enteredDate = NSDate()

 これらの型は名前が変わっただけではなく、内部の実装も大きく変わっています。実際にこれらの型の宣言を見ると、クラスではなく「struct」として作られていたり、プロトコルが一新されたりしています。

// Date
public struct Date : ReferenceConvertible, Comparable, Equatable, CustomStringConvertible {
    // 省略
}
// NSDate
public class NSDate : NSObject, NSCopying, NSSecureCoding {
    // 省略
}

 NSDateは使えなくなるのかというと、そんなことはなく、Dateと変換可能な型として今後も使えます。

_ = NSDate() as Date
_ = Date() as NSDate

GCDの変更

 メソッドやクラスに比べるとインパクトは小さいですが、GCD(Grand Central Dispatch:非同期処理)にも変更が加わりました。GCDとはメソッドを別スレッドで実行したり遅延実行したりできる仕組みです。

 これらは今まではグローバルな関数を使って実装してきましたが、Swift 3.0からはクラスを使って実装できるようになり、よりSwiftらしく書けるようになりました。

DispatchQueue.main.async(execute: {
    previewController.dismiss(animated: true, completion: nil)
})
// Swift2.x
// dispatch_async(dispatch_get_main_queue(), {
//     previewController.dismissViewControllerAnimated(true, completion: nil)
// })

公式の移行ガイドも参照しよう

 今回はSwift 3.0について書いてきましたがいかがでしたでしょうか。Swift 3.0の対応方法は公式ドキュメントもありますので、よろしければこちらも併せてご参照ください。

 さて、1年近くにわたって続けてきた本連載も今回が最後です。ここまで読んでいただいた皆さま、どうもありがとうございました。本連載が少しでも皆さまのお役に立てば幸いです。

筆者紹介

杉本裕樹

田町のベンチャーで働くエンジニア。

仕事ではiPhoneアプリの開発やRailsを使ったWebサービス開発を行っている。最近のマイブームはUnityを使った3Dゲーム開発。


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。