斯威夫特:这个 nil 是如何进入我的 [String: AnyObject] 字典的,我该如何摆脱它

本文关键字:字典 AnyObject 何摆脱 String 我的 这个 nil 何进入 | 更新日期: 2023-09-27 18:19:42

我在我的 Swift 应用程序中结合使用 AFNetworking 和 JSONModel 来与 .NET WCF 服务进行通信。一切都在工作,直到我拨打一个返回null值的电话

问题从这里开始:

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

responseObject是从 WCF 服务返回给我的内容中解析出来的(如果您需要更多背景知识,请参阅上一个问题(。我可以将其强制转换为Dictionary<String, AnyObject>集合(实际上必须这样做(并将其提供给AuthModel,这是JSONModel的子类,但我发现如果集合包含 .NET null 对象,则resultsnil,这会弄乱后面的所有代码。WCF 服务中的null是 .NET 土地中的空字符串。

如果我对resultsDict对象进行print(resultsDict),我会看到以下内容:

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

在此示例中,x 是一个字符串,y 是 c#/.NET 代码中的 int。

所以是的,当其中一个值为 nil/null 时,来自 JSONModel 的代码不满意是完全有道理的。然而

  1. 我不确定 nil/null 值在非可选 AnyObject 对象中到底是如何做到的,并且
  2. 我不确定如何消毒/摆脱它。

我不能把responseObject投给Dictionary<String, AnyObject?>,Xcode抱怨

Xcode 抱怨说,我无法通过迭代来替换Dictionary中的特定 nul/nill 值(因为我认为您无法真正直接使用 AnyObject 对象(

我不能只是创建第二个经过净化的字典,因为 JSONModel 显然需要对其进行<String, AnyObject>,并且我遇到了与上述相同的问题。

如何摆脱字典中的这个空/零对象?


好的,Martin R 的评论给了我提示,我需要想出一些代码来"清理"字典并在有 NSNull/nil/null 值的地方插入空字符串(显然只是 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并没有真正告诉我我不能为该字典分配任何东西,只是不是我这样做的方式。

我想现在的问题变成了 - 有没有更好的方法来做到这一点?我这样做的方式有点蛮力。

斯威夫特:这个 nil 是如何进入我的 [String: AnyObject] 字典的,我该如何摆脱它

这是代码的稍微简化版本,用于替换所有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] = ""
        }
    }
    // ...
}