web-dev-qa-db-ja.com

NSHTTPURLResponseの「Content-Type」ヘッダーにアクセスするにはどうすればよいですか?

これが私の素朴な最初のパスコードです:

var httpUrlResponse: NSHTTPURLResponse? // = (...get from server...)
let contentType = httpUrlResponse?.allHeaderFields["Content-Type"]

私はこのコードのさまざまな派生物を試しましたが、allHeaderFieldsプロパティのNSDictionaryタイプと、文字列またはオプションの文字列だけを取得したいという願望の間の基本的なインピーダンスの不一致に関連するコンパイラ警告/エラーを受け取り続けます。

型を強制する方法がわからないだけです。

19
Daniel

Swift 3では、次のようなことができます。

let task = URLSession.shared.dataTask(with: url) { data, response, error in
    if let httpResponse = response as? HTTPURLResponse, let contentType = httpResponse.allHeaderFields["Content-Type"] as? String {
        // use contentType here
    }
}
task.resume()

明らかに、ここではURLResponseresponse変数)からHTTPURLResponseに移動し、allHeaderFieldsからデータを取得します。すでにHTTPURLResponseをお持ちの場合、それはより簡単ですが、うまくいけば、これはアイデアを示しています。

Swift 2の場合、 この回答の以前のリビジョン を参照してください)。

24
Rob

これはXcode 6.1で動作します:

let contentType = httpUrlResponse?.allHeaderFields["Content-Type"] as String?

複数のキャストは必要ありません。

Xcode 6.3でSwift 1.2とすると、これは機能します:

let contentType = httpUrlResponse?.allHeaderFields["Content-Type"] as? String
1
Daniel

私はこれを簡素化するためにURLResponseへの拡張を使用しています(Swift 3):

extension URLResponse {

    func getHeaderField(key: String) -> String? {
       if let httpResponse = self as? HTTPURLResponse {
           if let field = httpResponse.allHeaderFields[key] as? String {
                return field
            }
        }
        return nil
    }
}
0
eskimwier
0
Greg Brown