Xcode 6.3/Swift 1.2に関する補足情報

Xcode 6.3/Swift 1.2になって、Swift言語の仕様変更がありました。
主な変更は以下の点です。

なお、「サンプルファイル(Xcode 6.3対応」では、すでに対応済みです。

 

■Swift 1.2での仕様変更箇所

●「as!」演算子ができました。

実行時に失敗する可能性のあるキャストはas!という新しい演算子をつけるようになりました。「実行時に失敗する可能性がある」ということがコードの読み手やメンテナンスする人にとって分かりやすくするためです。

【旧】

 let skView = self.view as SKView

【新】

 let skView = self.view as! SKView

●新たなネイティブのSetデータ構造

「値の重複を許さないSetデータ構造」が新しくできました。「touchesBegan」「touchesMoved」などのタッチイベント系の引き数の型が、Setデータ型に変わりました。

【旧】

 override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {

【新】

 override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {

 

●「if let」文が強化されました。

1つの「if let文」で複数の宣言ができるようになりました。
これまでのように「if let文」を入れ子にする必要がなくなりました。
これの記述は、どちらの書き方でも書けるので、修正は必要ありません。

【旧】

 var a:String?
 var b:String?
 if let myA = a {
  if let myB = b {
   println("a=\(myA),B=\(myB)")
  }
 }

【新】

 var a:String?
 var b:String?
 if let myA = a, myB = b {
  println("A=\(myA),B=\(myB)")
 }

■本書をXcode 6.3で使うときの変更箇所

本書を、Xcode 6.3で使うときは、以下の点を変更してお使いください。

Chapter 5-1 P164:使えるフォントを確認する方法

【現在】

 for fontName in UIFont.fontNamesForFamilyName(fontFamilyName as! String) {

【修正後】

 for fontName in UIFont.fontNamesForFamilyName(fontFamilyName as String) {

Chapter 6-3 P246

【現在】

 func webViewDidStartLoad(webView: UIWebView!) { func webViewDidFinishLoad(webView: UIWebView!) {

【修正後】

 func webViewDidStartLoad(webView: UIWebView) { func webViewDidFinishLoad(webView: UIWebView) {

Chapter 6-8 P268:2)読み込んだデータを変換して、配列や辞書データに変換する

P269:3)データを変換して、配列や辞書データに変換します

P271:2)プログラムを作る

【現在】

 let jsonArray = NSJSONSerialization.JSONObjectWithData(jsondata!, options: nil, error: nil) as NSArray

【修正後】

 let jsonArray = NSJSONSerialization.JSONObjectWithData(jsondata!, options: nil, error: nil) as! NSArray

P273:2)プログラムを作る

【現在】

 let jsonDictionary = NSJSONSerialization.JSONObjectWithData(jsondata!, options: nil, error: nil) as NSDictionary

【修正後】

 let jsonDictionary = NSJSONSerialization.JSONObjectWithData(jsondata!, options: nil, error: nil) as! NSDictionary

P274:2)プログラムを作る

【現在】

 let jsonArray = NSJSONSerialization.JSONObjectWithData(jsondata!, options: nil, error: nil) as NSArray

【修正後】

 let jsonArray = NSJSONSerialization.JSONObjectWithData(jsondata!, options: nil, error: nil) as! NSArray

P276:2)プログラムを作る

【現在】

 let jsonDictionary = NSJSONSerialization.JSONObjectWithData(jsondata!, options: nil, error: nil) as NSDictionary

【修正後】

 let jsonDictionary = NSJSONSerialization.JSONObjectWithData(jsondata!, options: nil, error: nil) as! NSDictionary

Chapter 7-2 P297:4)1つ目の画面(ViewController.swift)で、切り替わる前に値を渡して、戻ってきたら値を受け取って出力する処理を書く

【現在】

 var newVC = segue.destinationViewController as nextViewController let newVC = segue.sourceViewController as nextViewController

【修正後】

 var newVC = segue.destinationViewController as! nextViewController let newVC = segue.sourceViewController as! nextViewController

Chapter 7-3 P307:各画面で、プロパティを読み書きする

P309:4)1つ目の画面が表示されたら、カウントアップして、値を表示するプログラムを追加する

P310:5)2つ目の画面が表示されたら、カウントアップして、値を表示するプログラムを追加する

P313:10)3つ目の画面が表示されたら、カウントアップして、値を表示するプログラムを追加する

【現在】

 var myAp = UIApplication.sharedApplication().delegate as AppDelegate

【修正後】

 var myAp = UIApplication.sharedApplication().delegate as! AppDelegate

Chapter 8-2 P328:3)テーブルビューを表示するようにプログラムを修正する

【現在】

 var myStr = objects[indexPath.row] as String

【修正後】

 var myStr = objects[indexPath.row] as! String

P328:4)行が選択されたときのプログラムを作る

【現在】

 let object = objects[indexPath.row] as String let controller = segue.destinationViewController as DetailViewController

【修正後】

 let object = objects[indexPath.row] as! String let controller = segue.destinationViewController as! DetailViewController

Chapter 8-3 P338:2)プログラムを作る

【現在】

 for fontName in UIFont.fontNamesForFamilyName(fontFamilyName as String) { fontName_array.append(fontName as String)

【修正後】

 for fontName in UIFont.fontNamesForFamilyName(fontFamilyName as! String) { fontName_array.append(fontName as! String)

Chapter 8-4 P341:5)プログラムでTagを使ってオブジェクトにアクセスする

【現在】

 var cell = tableView.dequeueReusableCellWithIdentifier("myCell") as UITableViewCell var label1 = cell.viewWithTag(1) as UILabel

【修正後】

 var cell = tableView.dequeueReusableCellWithIdentifier("myCell") as! UITableViewCell var label1 = cell.viewWithTag(1) as! UILabel

P344:6)プログラムを作る

【現在】

 var cell = tableView.dequeueReusableCellWithIdentifier("myCell") as UITableViewCell var label1 = cell.viewWithTag(1) as UILabel var label2 = cell.viewWithTag(2) as UILabel

【修正後】

 var cell = tableView.dequeueReusableCellWithIdentifier("myCell") as! UITableViewCell var label1 = cell.viewWithTag(1) as! UILabel var label2 = cell.viewWithTag(2) as! UILabel

P352:8)プログラムを作る

【現在】

 var cell = tableView.dequeueReusableCellWithIdentifier("myCell") as myTableViewCell

【修正後】

 var cell = tableView.dequeueReusableCellWithIdentifier("myCell") as! myTableViewCell

Chapter 9-3 P361 P364 P365

【現在】

 let skView = self.view asSKView

【修正後】

 let skView = self.view as! SKView

P363 P366

【現在】

 override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {

【修正後】

 override func touchesBegan(touches: Set , withEvent event: UIEvent) {

Chapter 9-6 P383

【現在】

 override func touchesMoved(touches: NSSet, withEvent event: UIEvent) { override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {

【修正後】

 override func touchesMoved(touches: Set , withEvent event: UIEvent) { override func touchesBegan(touches: Set, withEvent event: UIEvent) {

Chapter 9-9 P398

【現在】

 override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {

【修正後】

 override func touchesBegan(touches: Set , withEvent event: UIEvent) {

Chapter 9-11 P405 P407

【現在】

 let scnView = self.view as SCNView

【修正後】

 let scnView = self.view as! SCNView

■Xcodeで自動的にプログラムを修正する方法

Swift 1.1で動いていたコードがSwift 1.2でエラーになったとき、プログラムを手で修正する方法だけでなく、Xcodeが自動的にプログラムを修正してくれる方法もあります。

●自動で修正する方法(1)

メニューの「Edit > Convert > To Latest Swift Syntax」を選択します。
Swift 1.2の書き方に自動修正してくれます。
一度に修正しきれない場合は、何回か繰り返します。

●自動で修正する方法(2)

エラー行の、赤い●をクリックします。
すると、その行をSwift 1.2の書き方に自動修正してくれます。