2016-02-28 96 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