2Dゲームを例にSwift 2からSwift 3への変更点と移行のポイントを見る:iOS SDKとSwiftで始めるゲーム作成入門(終)(2/2 ページ)
iPhoneゲームをSwift言語で作成してみたいという初心者向けにiOSのゲームフレームワークを使った作り方を一から解説する入門連載。今回は、これまでに作成したアプリのコードをSwift 3.0に対応することで、対応する際のポイントや3.0での変更点を解説します。併せて、Xcode 8のSwift 3.0自動変換ツールの使い方なども紹介します。
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ゲーム開発。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- iOSアプリ開発でObjective-CからSwiftに移行するための手順、注意点まとめ〜言語仕様の違いは? 連携時の呼び出し方は?
開発生産性や品質を向上させたいiOSアプリ開発者のためにObjective-CからSwiftへ移行するメリットや手順、注意点など勘所をまとめて紹介します。 - Apple WatchやiPhoneのアプリを作ろう! Playgroundで学ぶSwiftの基礎―変数、定数、型、演算
本連載では、これからプログラミングやiPhoneアプリ開発を始めてみたい方を対象に、開発に必要な知識を基礎から解説していきます。今回は、Swiftの変数、定数、型、演算などについてサンプルプログラムを交えて解説します。 - ユーザー解析機能が無料になったFirebaseの使い方超入門
Firebaseのデータベース機能を使って無料のチャットアプリを作ることで、FirebaseやFirebase Analyticsの使い方について解説します。