斯威夫特:这个 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
对象,则results
是nil
,这会弄乱后面的所有代码。WCF 服务中的null
是 .NET 土地中的空字符串。
如果我对resultsDict
对象进行print(resultsDict)
,我会看到以下内容:
[x: <null>, y: 0, __type: Authenticate:#SomeLibrary.Models]
在此示例中,x
是一个字符串,y
是 c#/.NET 代码中的 int。
所以是的,当其中一个值为 nil/null 时,来自 JSONModel 的代码不满意是完全有道理的。然而
- 我不确定 nil/null 值在非可选
AnyObject
对象中到底是如何做到的,并且 - 我不确定如何消毒/摆脱它。
我不能把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并没有真正告诉我我不能为该字典分配任何东西,只是不是我这样做的方式。
我想现在的问题变成了 - 有没有更好的方法来做到这一点?我这样做的方式有点蛮力。
这是代码的稍微简化版本,用于替换所有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] = ""
}
}
// ...
}