2014-08-28 89 views
0

我在我的Swift應用程序中使用AFNetworkingJSONModel的組合來與.NET WCF服務進行通信。一切工作,直到,直到地步,我提出,返回nullSwift:這是怎麼進入我的[String:AnyObject]字典,我該如何擺脫它?

呼叫的問題從這裏開始:

if let resultsDict = responseObject as? Dictionary<String, AnyObject> { 
    results = AuthModel(dictionary: resultsDict, error: nil) 
    .... 

responseObject從什麼WCF服務還給我分析(見this previous question如果你想要更多的背景)。我可以將它轉換爲Dictionary<String, AnyObject>集合(實際上必須)並將其提供給AuthModel,它是JSONModel的子類,但是我發現如果集合包含.NET對象,則resultsnil,這會混淆所有後來的代碼。而來自WCF服務的null是.NET land中的空字符串。

如果我的resultsDict對象上做一個print(resultsDict),我看到:

[x: <null>, y: 0, __type: Authenticate:#SomeLibrary.Models] 

在這個例子中,x是一個字符串,並y是從C#/ NET代碼的int。

所以是的,當JSONModel中的一個值爲nil/null時,它是非常有意義的。然而,

  1. 我不知道如何在赫克一零/空值是在非可選AnyObject對象,
  2. 我不知道如何清理/擺脫它。

我不能投responseObjectDictionary<String, AnyObject?>,Xcode的抱怨

我不能遍歷它替換Dictionary特定NUL/nill值,Xcode的抱怨(因爲你不能真正發揮作用與AnyObject對象直接,我認爲)

我不能只創建第二個,消毒字典,因爲JSONModel顯然需要它是<String, AnyObject>,我遇到了上述相同的問題。

如何擺脫我的字典中的null/nil對象?


OK,馬丁的r評論給了我,我需要拿出一些代碼,可以「乾淨」的字典,並插入空字符串那裏的NSNull /零/空值(實際上只是NSNull顯然)的提示。

if let resultsDict = responseObject as? Dictionary<String, AnyObject> { 
    var cleanedDict = Dictionary<String, AnyObject>() 
    for r in resultDict { 
     if r.1 as? NSObject == NSNull() { 
      cleanedDict[r.0] = "" 
     } 
     else { 
      cleanedDict[r.0] = r.1 
     } 
    } 
    results = AuthModel(dictionary: cleanedDict, error: nil) 
    .... 

所以我猜Xcode並沒有真的告訴我,我不能分配任何東西給字典,只是不是我這樣做。

我想現在的問題是 - 有沒有更好的方法來做到這一點?我這樣做的方式有點蠻力。

+3

''是'NSNull()'單,這是描述用於表示來自JSON對象的「null」。 - 但是是不同的*從零/空。 – 2014-08-28 17:04:31

+0

@MartinR確定你的評論加上操場破獲案件。我已經將它添加到問題中,直到/除非有人想出了一個很好的方法來做到這一點。如果不是,我會分出那部分並回答我自己的問題。 – 2014-08-28 19:26:15

回答

2

這是您的代碼的略微簡化的版本,以通過一個空字符串替換在字典中的所有NSNull 值:

if let resultsDict = responseObject as? [String:AnyObject] { 
    var cleanedDict = resultsDict // a mutable copy 
    for (key, elem) in cleanedDict { 
     if elem is NSNull { // NSNull is a singleton, so this check is sufficient 
      cleanedDict[key] = "" 
     } 
    } 
    // ... 
} 
相關問題