我尝试使用从.plist
文件中获取的API密钥来测试服务器响应。当我从请求标头中打印出密钥时,它有一个可选的包装器:Optional([App-Token: apikey1234567]))
。我没有收到回复,我认为这是因为密钥是以这种形式传递的。对Swift来说有点新鲜。我怎么能通过这个,所以它不是可选的?相关代码如下:
var key: String!
let baseURL: String = ("https://apiurl.com/").stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
override init() {
path = NSBundle.mainBundle().pathForResource("APIkey", ofType: "plist")
dict = NSDictionary(contentsOfFile: path!)
key = dict!.objectForKey("APIkey") as! String
super.init()
}
func updateJSON() {
var session = NSURLSession.sharedSession()
var request = NSMutableURLRequest(URL: NSURL(string: baseURL)!)
request.HTTPMethod = "GET"
request.setValue(key, forHTTPHeaderField:"App-Token")
// This prints out the 'Optional([App-Token: apikey1234567]))'
println("\(request.allHTTPHeaderFields))")
var dataTask = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in
var error: NSError?
if (error != nil) {
println("\(error)")
} else {
self.jsonObject = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &error) as? NSDictionary
println("\(self.jsonObject)")
}
})
dataTask.resume()
}
更新:我收到nil
,因为jsonObject
被投放为NSDictionary
。当我将其类型更改为AnyObject
时,响应又回来了。
答案 0 :(得分:1)
函数valueForHTTPHeaderField和allHTTPHeaderFields - 返回选项,它并不意味着你输入的键是可选的。来自Swift NSURLRequest文件:
func valueForHTTPHeaderField(field: String) -> String?
var allHTTPHeaderFields: [String : String]?
在init:
中设置后,通过添加print来检查键的值var key: String!
let baseURL: String = ("https://apiurl.com/").stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
override init() {
path = NSBundle.mainBundle().pathForResource("APIkey", ofType: "plist")
dict = NSDictionary(contentsOfFile: path!)
key = dict!.objectForKey("APIkey") as! String
println("On init Key = \(key)") // Check key value here is it optional?
super.init()
}
另外:dataTaskWithRequest返回可选的至少可选链:
dataTask?.resume()
您还有一个新错误:NSError在完成任务时创建,当它已经返回错误时,您是否意味着要为JSON解析创建此错误?最好将其命名为不同以避免任何歧义。一些var可以被允许,因为从来没有变异-session,request,dataTask。
func updateJSON() {
let session = NSURLSession.sharedSession()
let request = NSMutableURLRequest(URL: NSURL(string: baseURL)!)
request.HTTPMethod = "GET"
request.setValue(key, forHTTPHeaderField:"App-Token")
// This prints out the 'Optional([App-Token: apikey1234567]))'
println("\(request.allHTTPHeaderFields))")
let dataTask = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in
if (error != nil) {
println("\(error)")
} else {
var jsonError: NSError?
self.jsonObject = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: & jsonError) as? NSDictionary
println("\(self.jsonObject)")
}
})
dataTask?.resume()
}
(注意:此刻我只安装了带xcode 7和swift 2的机器,但我认为自Swift 1.2以来这些事情都没有改变)