这是我天真的第一次通过代码:
var httpUrlResponse: NSHTTPURLResponse? // = (...get from server...)
let contentType = httpUrlResponse?.allHeaderFields["Content-Type"]
我已经尝试了该代码的各种派生,但我不断收到编译器警告/错误,这些警告/错误与allHeaderFields属性的NSDictionary类型与我只想获得String或可选String之间的基本阻抗不匹配有关。
只是不知道如何强制类型。
您可以在Swift 3中执行以下操作:
if
let httpResponse = response as? HTTPURLResponse,
let contentType = httpResponse.value(forHTTPHeaderField: "Content-Type")
{
// use contentType here
}
task.resume()
显然,这里我要从URLResponse
(response
变量)转到HTTPURLResponse
。我使用的不是allHeaderFields
,而是类型化的value(forHTTPHeaderField:)
,它使用不区分大小写的键。
希望这能说明这个想法。
对于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
}
}
您可以只使用MIMEType
属性吗?
https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSURLResponse_Class/#//apple_ref/occ/instp/NSURLResponse/MIMEType
实际上,它应该像这个一样简单
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;
}
}