Xcode7に上げたらSwift2.0になって今までのアプリがエラーだらけになった

広告

Xcode,Swift2.0

なんとなく、Xcodeのバージョンアップ通知が来ていたので、アップデートしてみたのですが、今までのアプリが軒並みエラーでビルドが出来なくなりました。
Swiftのバージョンが1.2から2.0に上がったためではあるのですが、ここまで下位互換が無いとは思いませんでした。
ちゃんと調べてからアップデートするべきだったかなと後悔しましたが、いつかアップデートはしないといけないので、とりあえずググって対処方法を調べてみました。 


とりあえず1つめのアプリは、30個ほどのエラーと70個ほどの警告でした。

警告は放っておいても良いのですが、大別すると以下のような感じでした。

 

  1. varをletへ変更しましょう
  2. viewDidLoadなどは、OS10.10以上のみなのでバージョンチェックを入れましょう
  3. 使ってない変数は、_にするか消しましょう

 

1つめは、素直に変更すれば問題無いです。
2つめは、10.10以上の対応にすれば何もしなくて良いです。
3つめも、素直に変更なり削除すれば問題ないです。

 

これで警告は消えました。

 

次にやっかいなエラーとなるものです。
概ね以下の様な無いようでした。

 

  1. 'stringByAppendingPathComponent' is unavailable: Use URLByAppendingPathComponent on NSURL instead.
  2. Redundant conformance of 'xxxxxxx' to protocol 'NSDraggingDestination'
  3. Initializer for conditional binding must have Optional type, not 'NSURL'
  4. 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が実装されたのは個人的にはうれしい。