c# - Swift:这个 nil 是如何进入我的 [String: AnyObject] 字典的,我该如何摆脱它?

标签 c# wcf dictionary swift option-type

我正在使用 AFNetworking 的组合和 JSONModel在我的 Swift 应用程序中与 .NET WCF 服务进行通信。一切正常,直到我调用返回 null 的电话为止值(value)观

问题从这里开始:

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 null对象,然后 resultsnil ,这弄乱了后面的所有代码。和 null来自 WCF 服务的是 .NET 领域中的空字符串。

如果我做 print(resultsDict)resultsDict 上对象,我看到了这个:

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

在这个例子中,x是一个字符串,y是来自 c#/.NET 代码的 int。

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

  1. 我不确定 nil/null 值到底是怎么出现在非可选 AnyObject 中的对象,和
  2. 我不确定如何清理/清除它。

我不能投 responseObjectDictionary<String, AnyObject?> , Xcode 提示

我无法替换 Dictionary 中的特定 nul/nill 值通过迭代它,Xcode 提示(因为我认为你不能直接使用 AnyObject 对象)

我不能只创建第二个经过清理的字典,因为 JSONModel 显然需要它是 <String, AnyObject>我遇到了与上述相同的问题。

我怎样才能从我的字典中删除这个 null/nil 对象?


好吧,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 并没有真正告诉我我不能为那个字典分配任何东西,只是不是我这样做的方式。

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

最佳答案

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

关于c# - Swift:这个 nil 是如何进入我的 [String: AnyObject] 字典的,我该如何摆脱它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25554108/

相关文章:

c# - 覆盖ToString()以进行调试和记录-字符串是否应该本地化?

c# - 使用 OpenXML 将图片插入到 Word 文档的标题中

WCF 数据合约解析器

c# - 使用 WCF 的在线多人游戏

c++ - 解析 2D QVariantMap

c# - 如何将以毫秒为单位的日期时间插入到 Access 数据库中?

c# - HttpWebRequests 在后续调用中失败

database - 单元测试依赖于数据库的窗口服务

python - exec() 方法中自定义命名空间的子类 python 字典

python - 一次遍历 Python 字典 N 项以进行 CSV 写入