Xcode7に上げたらSwift2.0になって今までのアプリがエラーだらけになった
なんとなく、Xcodeのバージョンアップ通知が来ていたので、アップデートしてみたのですが、今までのアプリが軒並みエラーでビルドが出来なくなりました。
Swiftのバージョンが1.2から2.0に上がったためではあるのですが、ここまで下位互換が無いとは思いませんでした。
ちゃんと調べてからアップデートするべきだったかなと後悔しましたが、いつかアップデートはしないといけないので、とりあえずググって対処方法を調べてみました。
とりあえず1つめのアプリは、30個ほどのエラーと70個ほどの警告でした。
警告は放っておいても良いのですが、大別すると以下のような感じでした。
- varをletへ変更しましょう
- viewDidLoadなどは、OS10.10以上のみなのでバージョンチェックを入れましょう
- 使ってない変数は、_にするか消しましょう
1つめは、素直に変更すれば問題無いです。
2つめは、10.10以上の対応にすれば何もしなくて良いです。
3つめも、素直に変更なり削除すれば問題ないです。
これで警告は消えました。
次にやっかいなエラーとなるものです。
概ね以下の様な無いようでした。
- 'stringByAppendingPathComponent' is unavailable: Use URLByAppendingPathComponent on NSURL instead.
- Redundant conformance of 'xxxxxxx' to protocol 'NSDraggingDestination'
- Initializer for conditional binding must have Optional type, not 'NSURL'
- Nil is not compatible with expected argument type 'NSStringCompareOptions'
こちらの対処方法ですが、いろいろとググった結果、
1つめは、似たようなString関係のエラーが色々でましたが、Stringの使い方が変わったり関数が無くなったりしたためエラーとなっているので、extensionを設定するのが簡単でした。
2つめは、ドラッグアンドドロップのテキストフィールドを作っていたのですが、classに指定している、NSDraggingDestinationを消せば問題無いです。
3つめは、if letにNSURL型を指定していたのですが、その変数にNSURLの型を指定してあげれば問題無いです。
4つめは、stringByReplacingOccurrencesOfStringのデフォルト値が設定されたため、nilのものは必要が無くなったためですので引数がnilのものを消せば問題無いです。
修正方法のサンプルは以下の通りです。
1つめのextensionですが、以下を追加しておきました。
extension String { var lastPathComponent: String { get { return (self as NSString).lastPathComponent } } var pathExtension: String { get { return (self as NSString).pathExtension } } var stringByDeletingLastPathComponent: String { get { return (self as NSString).stringByDeletingLastPathComponent } } var stringByDeletingPathExtension: String { get { return (self as NSString).stringByDeletingPathExtension } } var pathComponents: [String] { get { return (self as NSString).pathComponents } } func stringByAppendingPathComponent(path: String) -> String { return (self as NSString).stringByAppendingPathComponent(path) } func stringByAppendingPathExtension(ext: String) -> String? { return (self as NSString).stringByAppendingPathExtension(ext) } }
2つめは、以下のように修正しました。
class DragDropTextField: NSTextField, NSDraggingDestination {
↓
class DragDropTextField: NSTextField {
3つめは、以下の様に修正しました。
if let url = NSURL(fileURLWithPath: file) {
↓
if let url:NSURL = NSURL(fileURLWithPath: file) {
最後の4つめは、以下の様に修正しました。
str.stringByReplacingOccurrencesOfString(":", withString: "_", options: nil, range: nil)
↓
str.stringByReplacingOccurrencesOfString(":", withString: "_")
その他細かいところ(NSDictionaryにnilを入れるなとか)もありますが、Xcodeの言うとおりにすれば直りました。
とりあえず、これでビルドは通るようになりましたが、それなりに修正しましたので、テストはしないといけないですね。
一番使うであろうStringの関数変更が影響大きかったかなと思います。
とりあえず、動くようになって良かったです。
if letだけだと辛い部分もあったので、Swift2.0になってtry catchが実装されたのは個人的にはうれしい。