API key swift的可选包装器

时间:2015-07-12 01:38:58

标签: ios iphone swift

我尝试使用从.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时,响应又回来了。

1 个答案:

答案 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以来这些事情都没有改变)