Xcode 6.1に関する補足情報

Xcodeは、6.0から6.1になって仕様変更がありました。
Swiftは新しい言語だからか、バージョンによってまだ細かい修正があるようです。
ですが、たいていの変更点は、Xcodeが修正をうまくアシストしてくれるようです。
そこで「その意味」と「修正の方法」について解説します。

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

 

●NSURLや、NSDataの変更点

NSURLや、NSDataなどのオブジェクトを作ったときの戻り値がオプショナル値になりました。
アプリが落ちる危険性を減らすための仕様変更のようです。
Xcode 6.0の書き方で書くとエラーが出るようになりましたが、これはXcodeが人間に対して
「指定したURLがなかったり、読み込もうとしたデータがない場合が考えられるので、ちゃんと中身の確認をしてください」
と言ってきているわけです。中身の確認をする修正をしましょう。

【簡単な修正方法】(Xcodeのバージョンが上がったときの簡単な対処方法)

簡単な修正方法として、「Xcodeがアシストしてくれる指示通りに従う」という方法があります。クリックするだけで、自動的に修正されます。

1)エラー行の先頭の◎をクリックします。
「このNSURLは、nilが入る可能性があるのでちゃんと確認してください」
というメッセージが出ます。

2)青い部分の「Fix-it Insert "!"」をクリックすると、自動的に修正が行われ、変数名の後に「!」が追加されます。
この「!」は、
「このURLにはちゃんと値が入っているはずだから、Xcodeさんはエラーを出さないで!」
という意味です

「とりあえずSwiftの勉強のために作るとき」にはこの方法で修正してもいいと思います。
ですが、もしも変数の値がnilならアプリが落ちる可能性があるので、「一般公開するアプリを作るとき」は、ちゃんとチェックするプログラムにする必要があります。

【ちゃんとチェックする修正方法】

NSURLや、NSDataの値を、一時的な定数に値を入れてif文でチェックします。
nilでない場合(letでちゃんと変数に値が入った場合)にだけその後の処理をするようにすることで、nilかどうかのチェックができるようになります。(★本文P128「nilかどうかチェックする」に詳しく解説しています)

【誤】

var myURL = NSURL(string: "http://www.apple.com/jp")
var myURLReq = NSURLRequest(URL: myURL)
myWebView.loadRequest(myURLReq)

【正】

var myURL = NSURL(string: "http://www.apple.com/jp")
if let url = myURL {
var myURLReq = NSURLRequest(URL: url)
myWebView.loadRequest(myURLReq)
} else {
// URLがなかったときの処理
}

------------------------------------------------------------
本書では、具体的に以下の所が変更点です。
「簡単な修正方法」で対応する方法を記述します。(★変数名の後に「!」を追加します。)

P237:(2)ファイルデータを作る
P239:(4)プログラムを作る
P240:画面キャプチャー内

【誤】

var myData = NSData(contentsOfURL: myURL)

【正】

var myData = NSData(contentsOfURL: myURL!)

P237:(3)イメージデータを作る
P239:(4)プログラムを作る
P240:画面キャプチャー内

【誤】

var myImage = UIImage(data:myData)

【正】

var myImage = UIImage(data:myData!)

P243:(3)URLリクエストを作る
P244:(4)URLリクエストを作って、ウェブビューに表示する
P246:(4)プログラムを作る
P247:画面キャプチャー内

【誤】

var myURLReq = NSURLRequest(URL: myURL)

【正】

var myURLReq = NSURLRequest(URL: myURL!)

P268:(2)読み込んだデータを変換して、配列や辞書データに変換する
P269:(3)データを変換して、配列や辞書データに変換します
P271:(2)プログラムを作る
P274:(2)プログラムを作る
P273:(2)プログラムを作る
P276:(2)プログラムを作る

【誤】

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

【正】

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

●テーブルビューの変更点

テーブルビューで、セルの中のラベルや、イメージビューの値がオプショナル値から普通の変数になりました。(★これまで、textLabelなどの後につけていた「?」を削除します。)

P318:表示に必ず必要なメソッド
P322:(2)プログラムを作る
P328:(3)テーブルビューを表示するようにプログラムを修正する
P331:文字内容を設定する
P335:(2)プログラムを作る

【誤】

cell.textLabel?.text = ...

【正】

cell.textLabel.text = ...

P332:セルに画像を設定する

【誤】

cell.imageView?.image =

【正】

cell.imageView.image =

P332:セルの色を設定する
P335:(2)プログラムを作る

【誤】

cell.textLabel?.textColor =

【正】

cell.textLabel.textColor =

P333:フォントやサイズを設定する
P335:(2)プログラムを作る

【誤】

cell.textLabel?.font =

【正】

cell.textLabel.font =

●SpriteKit、SceneKitの変更点

テンプレート内の「GameViewController.swift」が変更されました。
Xcode 6.0の頃のSpriteKitとSceneKitのテンプレートを使うとエラーが出るので、テンプレートの一部を修正します。(★Xcode 6.1で作り始めた場合は修正の必要はありません。)

■SpriteKitの「GameViewController.swift」

○「NSData.dataWithContentsOfFile」が「NSData(contentsOfFile」に変わりました。

【誤】

var sceneData = NSData.dataWithContentsOfFile(path, options: .DataReadingMappedIfSafe, error: nil)

【正】

var sceneData = NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe, error: nil)!

○「toRow()」が「rawValue」に変わりました。

【誤】

toRaw()

【正】

rawValue

■SceneKitの「GameViewController.swift」

○「SCNScene」の戻り値がオプショナル値に変わりました。

【誤】

let scene = SCNScene(named: "art.scnassets/ship.dae")

【正】

let scene = SCNScene(named: "art.scnassets/ship.dae")!

○「toRow()」が「rawValue」に変わりました。

【誤】

toRaw()

【正】

rawValue

●メソッドの引き数が2つ以上ある場合

少々条件が複雑ですが、作ったメソッドを使うとき、「引き数の数が2つ以上あって、ラベルを使っていない場合」には、呼び出し時に値だけでなく、ラベル名も指定する必要があります。

引き数の数が2つ以上あって、ラベルを使っていない場合、呼び出すときに2つ目以降の変数名をラベルとして指定します。(1つ目はラベル指定をせず、そのまま値を書きます)

例)
引き数が3つあって、ラベルを使っていない場合

func myFunc(val1:Int, val2:Int, val3:Int)->Int {
return val1 * val2 * val3
}

2つ目以降の引き数には変数名をラベルとして指定する

var ans = myFunc(1, val2: 2, val3: 3)