前項までタワーディフェンスをSwift 3.0に対応させる方法を紹介してきました。次はSwift 3.0での変更点を見ていきます。
冒頭でも少しお話しした通り、今回は多くの標準ライブラリのメソッド名が変更されました。対応は大変ですが、全体的に、冗長なメソッド名が短くなったので、開発効率の向上が見込めそうです。
タワーディフェンスアプリで使っているメソッドでは「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引数のラベルを省略できましたが、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のクラスで、今までは先頭に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(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.