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

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

iPhoneゲームをSwift言語で作成してみたいという初心者向けにiOSのゲームフレームワークを使った作り方を一から解説する入門連載。今回は、これまでに作成したアプリのコードをSwift 3.0に対応することで、対応する際のポイントや3.0での変更点を解説します。併せて、Xcode 8のSwift 3.0自動変換ツールの使い方なども紹介します。

[杉本裕樹,マネーフォワード]

 本連載「iOS SDKとSwiftで始めるゲーム作成入門」は、iPhone向けのゲーム開発の入門連載です。タワーディフェンスを題材に、「SpriteKit」というゲーム開発フレームワークの解説やゲームの開発手法について書いています。

 前回の「iOS 9のReplayKitでゲームプレー動画を撮影&シェア」まででタワーディフェンスの機能を一通り実装してきました。

 連載最終回の今回は、前回までに作成したタワーディフェンスアプリのコードをSwift 3.0に対応します。これにより、Swift 3に対応する際のポイントやSwift 2.3から3.0への変更点を共有できればと思います。併せて、Xcode 8のSwift 3.0自動変換ツールの使い方も紹介します。

 ソースコードは、こちらを元に対応を進めます。Swift 3.0に対応したソースコードは、こちらからダウンロードできます。変換前のソースコードと併せて、Swift 2.3からSwift 3.0への変更点をご確認ください。

Swift 2からSwift 3へ変換するタワーディフェンスゲーム

Swift 3.0の概要

 Swift 3.0は2016年の秋に正式リリースされる予定で、Xcode 8から使えるようになります。2015年にSwift 1.2からSwift 2.0になったときに多くの変更が加わりましたが、今回のバージョンでも非常に多くの変更が加えられています。

 Swift 3.0での変更点は、大幅な機能追加というより、クラスやメソッドの見直しが中心になっています。Swift 3.0への移行に伴い、Foundationクラスの置き換えや標準ライブラリのメソッド名の改善などが多くありました。機能追加は少ないのですが、広い範囲にわたって変更が加えられています。

Xcode 8のSwift 3.0自動変換ツール

 前項でSwift 3.0では大きな変更があったと書きましたが、コードの対応はそこまで難しくありません。Xcode 8にはSwift 3.0への自動変換ツールがあるので、それを使えば、ほとんど自動でSwift 3.0に対応できます。

 タワーディフェンスアプリでも多くのファイルで変更が必要でしたが、手動で対応が必要なものは1ファイルだけでした。

Xcode 8のSwift 3.0自動変換ツールの使用例

 変換ツールはXcode 8でプロジェクトを開いたときに自動で起動します。プロジェクトを開くとポップアップで「Convert to Current Swift Syntax?」と聞かれるのでそのポップアップの指示に従っていけば変換できます。

 もし手動で変換ツールを起動したい場合はXcodeのメニューの「Edit」→「Convert」→「To Current Swift Syntax...」を選択します。

自動変換ツールで変更できなかった点

 今回自動で変更できなかったのはGameViewControllerの一部メソッドです。

 下記コードを見ると分かるように、Swift 3.0からUIViewControllerの一部メソッドがプロパティーに変わりました。ここだけは自動で変換できなかったので手動変換が必要です。

class GameViewController: UIViewController {
    // 省略
 
    override var shouldAutorotate: Bool{
        return false
    }
    // ↓ Swift2.x
    // override func shouldAutorotate() -> Bool {
    //     return true
    // }
 
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        if UIDevice.current.userInterfaceIdiom == .phone {
            return .allButUpsideDown
        } else {
            return .all
        }
    }
    // ↓ Swift2.x
    // override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    //     if UIDevice.currentDevice().userInterfaceIdiom == .Phone {
    //         return .AllButUpsideDown
    //     } else {
    //         return .All
    //     }
    // }
 
    override var prefersStatusBarHidden: Bool {
        return true
    }
    // ↓ Swift2.x
    // override func prefersStatusBarHidden() -> Bool {
    //     return true
    // }
}

Xcode 8でSwift 2.3を使う方法

 ここまででSwift 3.0に対応した過程を書いてきましたが、実はSwift 2.3を使い続けることもできます。Xcode 8の「Build Settings」に「Use Legacy Swift Language Version」という設定が追加されているので、この値を「YES」にすることでSwift 2.3を使い続けることができます。もしSwift 3.0対応がうまくいかないときは試してみるといいでしょう。

CocoaPodsを使っている場合

 CocoaPodsでライブラリを管理している場合は少し手間が掛かります。

 ライブラリも「Use Legacy Swift Language Version」を「YES」にすることでSwift 2.3の構文で動かせます。ライブラリによってはそれだけで動くのですが、標準ライブラリのメソッドでの変更(戻り値の型が変わるなど)があった場合は何かしらの対策が必要になってきます。

 一番の対策はライブラリの作者が作っているSwift 3.0ブランチを使うことです。著名なライブラリの場合は大抵Swift 3.0用ブランチは作成されているので、それを利用するといいでしょう。

pod 'Alamofire', git: "https://github.com/Alamofire/Alamofire.git", branch: "swift3"

 対応されていない場合は、他のライブラリを探すか、直接ライブラリをプロジェクトに追加するなどの方法が必要になります。

       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

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

メールマガジン登録

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