これが私の素朴な最初のパスコードです:
var httpUrlResponse: NSHTTPURLResponse? // = (...get from server...)
let contentType = httpUrlResponse?.allHeaderFields["Content-Type"]
私はこのコードのさまざまな派生物を試しましたが、allHeaderFieldsプロパティのNSDictionaryタイプと、文字列またはオプションの文字列だけを取得したいという願望の間の基本的なインピーダンスの不一致に関連するコンパイラ警告/エラーを受け取り続けます。
型を強制する方法がわからないだけです。
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()
明らかに、ここではURLResponse
(response
変数)からHTTPURLResponse
に移動し、allHeaderFields
からデータを取得します。すでにHTTPURLResponse
をお持ちの場合、それはより簡単ですが、うまくいけば、これはアイデアを示しています。
Swift 2の場合、 この回答の以前のリビジョン を参照してください)。
これは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
私はこれを簡素化するために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
}
}