Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 我如何访问;“内容类型”;NSHTTPPURLResponse的标题?_Ios_Swift_Content Type_Nshttpurlresponse - Fatal编程技术网

Ios 我如何访问;“内容类型”;NSHTTPPURLResponse的标题?

Ios 我如何访问;“内容类型”;NSHTTPPURLResponse的标题?,ios,swift,content-type,nshttpurlresponse,Ios,Swift,Content Type,Nshttpurlresponse,以下是我天真的第一次通过代码: var httpUrlResponse: NSHTTPURLResponse? // = (...get from server...) let contentType = httpUrlResponse?.allHeaderFields["Content-Type"] 我已经尝试了这段代码的各种派生,但我不断收到编译器警告/错误,这些警告/错误与allHeaderFields属性的NSDictionary类型和我只想获得字符串或可选字符串之间的基本阻抗不匹配有

以下是我天真的第一次通过代码:

var httpUrlResponse: NSHTTPURLResponse? // = (...get from server...)
let contentType = httpUrlResponse?.allHeaderFields["Content-Type"]
我已经尝试了这段代码的各种派生,但我不断收到编译器警告/错误,这些警告/错误与allHeaderFields属性的NSDictionary类型和我只想获得字符串或可选字符串之间的基本阻抗不匹配有关


只是不知道如何强制这些类型。

实际上,它应该像这样简单

NSString* contentType = [[(NSHTTPURLResponse*)theResponse allHeaderFields] valueForKey:@"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;
     }
 }

这适用于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

您可以在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()
显然,这里我要从
urresponse
response
变量)到
httpurresponse
,并从
allHeaderFields
获取数据。如果您已经有了
HTTPURLResponse
,那么它会更简单,但希望这能说明这个想法


有关Swift 2,请参见。

您可以只使用
MIMEType
属性吗


我使用URL响应的扩展来简化此响应(Swift 3):


请回答Swift语言。对不起,我认为用Swift标记问题并包含Swift示例代码会有所帮助。此外,我认为查找是不区分大小写的(根据文档)。HTTP头字段不区分大小写,而字典查找是区分大小写的,但根据
allHeaderFields
文档,幸运的是,“为了简化代码,某些头字段名称被规范化为其标准形式”。所以你可以查找
内容类型
@Daniel你应该只在Swift上标记它,上面有一个Objective-C标记!所以不管怎么说,如果你不知道如何把它转换成Swift,你就陷入了一个大麻烦trouble@AubadaTaljo用objective-c标记这一点也是完全有效的。他们提供的代码是swift提供的,所以你应该提供一个快速的答案,这样做的方式是,如果他们自己不能转换代码,你就不会告诉他们他们遇到了大麻烦,如果他们知道如何转换,他们就不会问这个问题。回答不好,因为你没有正确阅读问题,在澄清后没有提供他们想要的。如果你想变得挑剔,看起来你不知道你在回答什么。为什么你需要在把它转换成字符串之前先转换成NSString呢?难道不是
吗?字符串
work?@AaronBrager-BTW,如果让contentType=。。。作为?NSSTRINGAS?不再需要字符串。我刚刚在Xcode 6.3.1中对其进行了测试,直接转换到
字符串的简单转换现在可以正常工作了。因此,我从我的答案中删除了前一个繁琐的语法。第二个语句甚至在1.2之前就可以使用,但我想在9月份就不行了?
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()
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
    }
}