アレアレ

お役立ち情報、お悩み解決情報を発信!

xcode

Xcode8でのSwift2.2→3への変換でビルドが通らなくなった箇所

Xcode8でのSwift2.2→3への変換でビルドが通らなくなった箇所

今回は、これからXcode8を初めて試す人にお伝えしたいお役立ち情報です。

私は、Xcode7(正確には、7.3.1)、swift 2.2の環境でiOSのアプリ開発していました。で、ちょうどXcode8の正式版が出たので、そのアプリのswift3化を試すことにしたんですね。

で、Xcode8には、swift2.2からswift3に変換する機能があるんですね。具体的にはXcode8で、Xcode7で作成したswfit 2.2のアプリのプロジェクトを開くと、swift3の記述方式に変換する画面が表示されます。

そして、私は、「Xcodeの変換に任せて、ビルドが通らなくなったら嫌だな〜」と感じつつも、とりあえず、「えいやっ」と、変換してみることにしました。

その結果、案の定、swift3に変換したソースコードのビルドが通らなくなったんですね。そこで今回は、その通らなくなった箇所と、その修正方法をご紹介します。

ちなみに、私が試したアプリでは、その1か所のみがビルドが通らなくなる原因でした。なので、それ以外は思った以上に、Xcodeの変換任せでうまく行きました。

開発環境

はじめに、今回の検証をした開発環境ですが、次の通りです。

  • Mac OS: OS X El Capitan(バージョン10.11.6)
  • Xcode: Version 7.3.1(7D1014) → Version 8.0(8A218a)
  • Swift: version 2.2 (swiftlang-703.0.18.8 clang-703.0.31) → version 3.0 (swiftlang-800.0.46.2 clang-800.0.38)
    ※「→」の前後は、変換前と後の環境を表しています。

NSMutableURLRequestを利用した箇所のビルドが通らなくなる

では、Xcode8のswift2.2→swift3への変換を行った結果、ビルドが通らなくなった箇所ですが、swift2.2に置いて、NSMutableURLRequestを使っていた箇所です。

具体的なコードの例を示すと、次のようなコードです。

swift 2.2でのコード

        let requestURL: NSURL = NSURL(string: "http://apple.com")!
        let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL)
        let session = NSURLSession.sharedSession()
        
        let task = session.dataTaskWithRequest(urlRequest) {
            (data, response, error) -> Void in
            //処理
        }

以上のコードが、Xcode8の変換を行った結果、次のように変換されたんですね。

Xcode8がswift3に変換した時点のコード

        let requestURL: URL = URL(string: "http://apple.com")!
        let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL)
        let session = URLSession.shared
        
        let task = session.dataTask(with: urlRequest, completionHandler: {
            (data, response, error) -> Void in
            //処理
        }) 

このXcode8がswift3に変換したコードにおいて、session.dataTaskメソッドに関して、コンパイルエラーが発生し、ビルドが通らない状況となりました。

で、最初は、swift2.2のコードにおける、session.dataTaskWithRequestが、session.dataTaskに変更されたことによる何らかの問題かと疑っていました。ですが、それが原因ではありませんでした。

実際には、session.dataTaskメソッドに渡す、リクエストオブジェクトの型の問題でした。具体的には、NSMutableURLRequestの利用をやめて、URLRequestに変更する必要がありました。

Xcode8がswift3に変換したコードをビルドを通るにようにしたコード

        let requestURL: URL = URL(string: "http://apple.com")!
        let urlRequest = URLRequest(url: requestURL) //NSMutableURLRequest→URLRequestに変更
        let session = URLSession.shared
        
        let task = session.dataTask(with: urlRequest, completionHandler: {
            (data, response, error) -> Void in
            //処理
        }) 

このようにコードを修正した結果、ビルドも問題なく通りました。また、実際の動作としても、ネット上からデータを取得する処理がちゃんと機能していることも、確認できました。

Return Top