2016-09-20 11 views
1

Swift 2.2のコードビルディングを移行し、xcode 7/ios 8とios 9でうまく動作します。 からSwift 3はiOS 8以降に対応しています。また、私は新しいAPIを使うことができなくなることを知っています。私のアプリでswift 3はiOS 9のNSURLクラスと互換性がありませんか?

は、私はいくつかのファイルなどをダウンロードして、いくつかのHTTPS要求を作成してい

私の仮定は、私はまた、iOS版から使用可能なクラスなどNSURL、URLSessionDownloadDelegate、NSMutableURLRequest、すべてを使用することができるはずということです

(8.0以降)。

URLクラス(iOS 10から利用可能)を使用するか、コンパイラが 'NSURL'が暗黙的に 'URL'に変換されないと言うので、私はiOS 8.1でマイグレーションされたコードを実行しているクラッシュを実行します。またthis question)。

ので、私はここでのiOS 9.

と互換性を持つようにしたい場合は、URLクラスを使用することはできませんよ、物事をより明確にするためにいくつかのコードは次のとおりです。

スウィフト2:

class ServerCom: NSObject, NSURLSessionDownloadDelegate { 
    private var fileURL: NSURL = NSURL() 
    [...]  
      guard let urlString: NSURL = 
     NSURL(string: params, 
      relativeToURL: NSURL(string: dcParam.baseURL)) else { 
       let failed = "Could not generate URL from: \(dcParam.baseURL)\(params)" 
       throw fetchAppXmlError.FAILED_URL_GENERATION(failed) 
    } 
    [...] 
    let request = NSMutableURLRequest(URL: urlString) 
    request.timeoutInterval = 10 
    request.HTTPMethod = "GET" 

} 

スウィフト3

class ServerCom: NSObject, URLSessionDownloadDelegate { 

fileprivate var localFileURL: NSURL = NSURL() 

[...] 

     guard let urlString: NSURL = 
      NSURL(string: params, 
       relativeTo: NSURL(string: dcParam.baseURL)) else { 
        let failed = "Could not generate URL from: \(dcParam.baseURL)\(params)" 
        throw fetchAppXmlError.failed_URL_GENERATION(failed) 
     } 

let request = NSMutableURLRequest(url: urlString) 
request.timeoutInterval = 10 
request.httpMethod = "GET" 
[...] 

} 
聞かせて要求= ...:とのラインで

  1. :私は次のエラーを取得し、迅速な3コードでは10

    「NSURL」「URL」に暗黙的に変換できません。明示的に変換するために「as」を使用することを意味しましたか?

  2. let urlString = ...の行で、 'NSURL?'型の値を変換できません。期待される引数型 'URL?'

URLタイプのlocalFileURLは、iOS 10のみで使用できません。 また、NSMutableURLRequestの代わりにURLRequestを使用することもできません。これは、iOS(10.0以降)でも使用できるためです。私はいつも "古い" NSURLではなくURLのタイプのURLを使用しているようです。

だから私の質問は: NSURLを使用する方法ですか? al。すばやく3 iOS 9?

さらに一般的には、iOS 9とiOS 10で動作する迅速な3でバックグラウンドダウンロードを行う方法はありますか?

この矛盾は、NSURLComponentsからURLComponentsへのブリッジに由来しますか?私は自分の質問に答えることができOOPer

+0

FoundationとSwiftタイプを簡単に結婚させることができます。 'urlString as URL'と' as 'の後ろに感嘆符/疑問符を付けないでください – vadian

+1

これは間違っています:これはiOS 10だけなのでURLタイプのlocalFileURLは使用できません._ iOS 9で実行される 'URL'または' URLRequest'デバイスに問題はありません。 「可用性」ノートは混乱させるものですが、デプロイメントターゲットを適切に設定すると、Xcode/Swiftは実際に利用できないことを警告します。 'URL'と' URLRequest'を試して、実際のiOS 9デバイスでテストしてみてください。 – OOPer

+0

ありがとうOOPer!あなたのヒントは正しい方向に私を連れて行きました!これらの可用性メモは本当に混乱しています。私は今自分の質問に答えることができます。 –

答えて

0

ありがとう:あなたはあなたのシミュレータとして同じ iOSのバージョンにDeplyoment目標を設定した場合にのみ

コードはURLクラスで正常に動作しますが、!

XCode 8はiOS 9 SDKをバージョン10にアップデートしたため、iOS 10またはiOS 8.1でシミュレータを使用することができました。しかし、Deployment TargetはiOS 9に設定されていました(iOS 8.1にアップグレードする前であることは間違いありませんでした)。

は、だから私は、iOS 8.1シミュレータでランタイムエラーに遭遇すると展開のターゲットは、iOS 9.

に設定しかし、それは、iOS 8.1に設定するのiOS 8.1シミュレータデプロイメント・ターゲットで仕事を行います!ここで

は、iOS 8.1にも取り組んでスウィフト3コード:

class ServerCom: NSObject, URLSessionDownloadDelegate { 

fileprivate var localFileURL: URL = URL(string: "dummy")! 

[...] 

     guard let urlString: URL = 
      URL(string: params, 
       relativeTo: URL(string: dcParam.baseURL)) else { 
        let failed = "Could not generate URL from: \(dcParam.baseURL)\(params)" 
        throw fetchAppXmlError.failed_URL_GENERATION(failed) 
     } 

     var request = URLRequest(url: urlString) 
     request.timeoutInterval = 10 
     request.httpMethod = "GET" 
[...] 

} 

ありがとうございました!

関連する問題