19

这是我天真的第一个密码:

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

我已经尝试了此代码的各种派生,但我不断收到与 allHeaderFields 属性的 NSDictionary 类型之间的基本阻抗不匹配相关的编译器警告/错误,而我只想获得一个字符串或可选字符串。

只是不确定如何强制类型。

4

5 回答 5

26

您可以在 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,请参阅此答案的先前版本

于 2014-09-01T21:44:09.670 回答
1

这适用于 Xcode 6.1:

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

不再需要多次转换。

在带有 Swift 1.2 的 Xcode 6.3 中,这可以工作:

let contentType = httpUrlResponse?.allHeaderFields["Content-Type"] as? String
于 2014-09-01T21:10:11.690 回答
1

我使用 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
    }
}
于 2017-08-10T23:05:19.300 回答
-2

其实应该就这么简单

NSString* contentType = [[(NSHTTPURLResponse*)theResponse allHeaderFields] valueForKey:@"content-type"];

或者

NSString* contentType = [[(NSHTTPURLResponse*)theResponse allHeaderFields][@"content-type"]];

但问题是响应可能会以大写或小写形式返回键的名称,而 NSDictionary 对键确实区分大小写,因此您应该对键进行不区分大小写的搜索

NSDictionary* allFields = [[(NSHTTPURLResponse*)theResponse allHeaderFields];
NSString* contentType;
for (NSString* key in allFields.allKeys) {
     if ([key compare:@"content-type" options:NSCaseInsensitiveSearch] == NSOrderedSame) {
          // This is it
          contentType = allFields[key];
          break;
     }
 }
于 2014-09-01T19:35:05.263 回答