2016-02-28 25 views
0

我正在嘗試爲我的REST參數創建一個字典。我遇到的問題是我的數據模型使用了許多可選的值,而我的params字典當然不能採用零值。我想要做的是爲可能爲零的值設置NSNull()。例如,這是我如何創建我的參數。創建可能具有零值的REST參數字典

func addBook(book : Book, completionHandler: (error: NSError!) -> Void) { 

     let params : [String: AnyObject] = ["title": book.title!, "author": book.author!] 


     Alamofire.request(.POST, booksEndpoint, parameters: params, encoding: .JSON) 
      .responseJSON { response in 
      ... 
      ... 

在這裏,我隱式地解開我的變量,當對象爲零時導致崩潰。

這裏是我如何初始化我的數據模型

class Book: NSObject { 

    var title : String? 
    var author : String? 

    //Create a custom initializer from parsed JSON object 
    init (book : NSDictionary) 
    { 

     if let author = book["author"] as? String { 
      self.author = author 
     } 
     if let title = book["title"] as? String { 
      self.title = title 
     } 
    } 
} 

我應該如何妥善處理這種情況在我的PARAMS可能是零,我需要的鍵值設置爲NSNull()?在一個現實的情況下,我會有更多的參數和可能的零值。

回答

1

取而代之的是使用??(nil coalescing)運算符。

let params : [String: AnyObject] = ["title": book.title ?? NSNull(), "author": book.author ?? NSNull()] 

或者乾脆

var params: [String: AnyObject] = [:] 
params["title"] = book.title 
params["author"] = book.author 

這將不分配在所有如果右邊的值是nil

當然有一個區別。第一種方法將在您的JSON中產生null值,第二種方法將默默省略所有null值。

+0

真棒。謝謝 – Andy

+0

但是,當我用?在一個大的參數列表中,我可以給出一個錯誤,說明字典太複雜了。 – Andy

+1

@Andy當類型推斷變得太複雜時,會發生這種情況。你可以結合使用這兩種方法並使用'var'聲明,然後使用'params [「title」] = book.title NSNull()' – Sulthan

相關問題