工場裏のアーカイブス

素人によるiPhoneアプリ開発の学習記

Swift 1.2におけるタッチイベント系メソッドの変更点

最近は本業の忙しさもあり、少々プログラミングから離れていたのですが、久々にXcodeを(更新があったのでアップデートしてから)起動してみたところ、以前は問題なくビルド出来たプロジェクト(Swift使用)でエラーが出てしまう問題に直面しました。

調べてみると、どうやらXcode 6.3からSwiftのバージョンが1.2にアップグレードし、それに伴っていくつか言語仕様の変更が生じたようです。例えばtouchesBeganなどのタッチイベント系のメソッドでは、以下のような引数touchesの型変更が行われており、前述のエラーはこのことが原因であったようです。

//従来のtouchesBeganメソッド
override func touchesBegan(touches: NSSet, withEvent event: UIEvent){

//Swift 1.2からの新しいtouchesBeganメソッド
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {

このSetというデータ型は、NSSetの代替としてSwift 1.2から新しく追加されたものですが、NSSetのようにanyObject()は利用出来ないようです。そのため例えば、touchesBeganメソッドでタッチ位置の座標を検出する場合、以下のようにSwift 1.2では従来と異なる記述が必要となるようです。

//従来のtouchesBeganメソッドによる、タッチ位置の座標検出例
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        let p = touches.anyObject()!.locationInView(self.view) //変数pにタッチ位置の座標が入る
        ……

///Swift 1.2からの新しいtouchesBeganメソッドによる、タッチ位置の座標検出例
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        if let touch = touches.first as? UITouch{
            let p = touch.locationInView(self.view) //変数pにタッチ位置の座標が入る
            ……


(2015/12/29 追記)
2015/9/16にはSwift 2.0がリリースされており、それに伴い、またタッチイベント系のメソッドにわずかな変更が生じたようです。

//Swift 1.2のtouchesBeganメソッド
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {

//Swift 2.0の新しいtouchesBeganメソッド
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

Swift 2.0で、touchesBeganメソッドによりタッチ位置の座標を検出するためには、以下のようにすればOKのようです。

//Swift 2.0からの新しいtouchesBeganメソッドによる、タッチ位置の座標検出例
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
       if let touch = touches.first{
            let p = touch.locationInView(self.view) //変数pにタッチ位置の座標が入る
            ……