这是我天真的第一次密码:
var httpUrlResponse: NSHTTPURLResponse? // = (...get from server...)
let contentType = httpUrlResponse?.allHeaderFields["Content-Type"]
我已尝试过对此代码的各种推导,但我不断收到与allHeaderFields属性的NSDictionary类型之间的基本阻抗不匹配有关的编译器警告/错误以及我希望获得String或可选String。
只是不确定如何胁迫这些类型。
答案 0 :(得分:24)
您可以在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,请参阅previous revision of this answer。
答案 1 :(得分: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
答案 2 :(得分:0)
答案 3 :(得分:-2)
实际上它应该像这个一样简单
NSString* contentType = [[(NSHTTPURLResponse*)theResponse allHeaderFields] valueForKey:@"content-type"];
或
NSString* contentType = [[(NSHTTPURLResponse*)theResponse allHeaderFields][@"content-type"]];
但问题是响应可能会将键的名称作为大写的一个或小写的一个返回,而NSDictionary对键是真的区分大小写,所以你应该对键进行自己不区分大小写的搜索< / p>
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;
}
}