2015-07-12 65 views
1

我正在嘗試使用取自.plist文件的API密鑰來測試服務器響應。當我從請求頭打印出密鑰時,它有一個可選的包裝器:Optional([App-Token: apikey1234567]))。我沒有得到迴應,我認爲這是因爲密鑰正在以這種形式傳遞。 Swift有點新鮮。我怎麼能通過這個,所以它不是可選的?以下相關代碼:可選API封裝周圍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() 
} 

UPDATE:我正在nil因爲jsonObject正在投作爲NSDictionary。當我將其類型更改爲AnyObject時,響應回來了。

+0

你試過字典! objectForKey(「APIkey」)爲!串! ? – Miknash

+0

剛試過。仍然是可選的包裝。 – Ja5onHoffman

+0

關鍵!串!在更新JSON方法?奇怪的是,它是可選的,因爲你聲明它爲非可選字符串字符串從字典作爲非可選... – Miknash

回答

1

函數valueForHTTPHeaderField和allHTTPHeaderFields - 返回可選項,它並不意味着您放入的鍵是可選的。從斯威夫特的NSURLRequest文件:

func valueForHTTPHeaderField(field: String) -> String? 

var allHTTPHeaderFields: [String : String]? 

檢查鍵的值在初始化設置之後添加打印:

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?簡歷()

你也有一個新的錯誤:NSError在任務完成時創建,當它已經返回一個錯誤時,它顯示你的意思是爲JSO創建這個錯誤N解析?最好將其命名爲不同以避免含糊不清。有些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和安裝在這一刻迅速2,但我不認爲,因爲雨燕1.2這些事情已經改變)

+0

好的提示。謝謝。由於其他原因,API必須返回nil。 – Ja5onHoffman