我的应用程序中有一个类,用户输入值并将其设置为类的实例,然后我将此数据上传到数据库,但我必须将类转换为数据库接受的内容并且我使用镜像反射转换为字典。我班上的一些属性可能是零,因为通过设计并不是所有属性都是必需的。但我无法将nil值传递给数据库。
我重新创建了我的例子,非常简化的游乐场。我没有为类
的name属性设置一个值在将密钥,值对添加到字典之前,我尝试检查nil 以下是我的代码
import UIKit
class Color: NSObject {
var name: String?
var code: Int?
var shade: String?
}
let cl = Color()
cl.code = 3456
cl.shade = "DARK"
var colorDict = [String: Any]()
for x in Mirror(reflecting: cl).children.makeIterator() {
if let val = x.value as Any? {
print(type(of: val))
colorDict[x.label!] = val
}
}
print (colorDict)
控制台中的输出如下
Optional<String>
Optional<Int>
Optional<String>
["name": nil, "code": Optional(3456), "shade": Optional("DARK")]
如何检查nil值并跳过将该属性添加到Dictionary
在我添加包括nils在内的所有值并检查值之后,我试图遍历字典,但是我得到了以下警告
将“Any”类型的非可选值与nil进行比较始终返回false
将字典声明如下
var colorDict = [String: Any?]()
for x in colorDict {
if x.value == nil {
colorDict.removeValue(forKey: x.key)
}
}
删除警告,但不删除任何内容。
我真的很感谢你的帮助。
答案 0 :(得分:3)
使用filter
:
let dict: [String : Any?] = ["Foo" : 3, "Bar" : nil, "Baz" : "Qux"]
let noNils = dict.filter { $0.value != nil }
print(noNils) // prints ["Foo": Optional(3), "Baz": Optional("Qux")]
答案 1 :(得分:2)
正如我所说,初始化所有值。
如果你决定不存储nil值,那么你最终会得到一些孩子,他们中的一些会有1个,2个和3个节点,没有任何问题,但是当你去读它们会发生什么?
您还没有分享有关应用程序如何使用这些值的任何信息,但假设您有一个函数来读取存储颜色的属性/节点,它将会读取所有3:
for ($a = 1; $a <= $numPages; $a++) {
echo '<a href="?page=' . $a . '">' . $a . '</a>';
}
查看问题?
答案 2 :(得分:2)
展开包含选项的Any
类型对象的方法有点奇怪,但您可以检查镜像中的值不是这样的:
for x in Mirror(reflecting: cl).children {
if case Optional<Any>.some(let val) = x.value {
print(type(of: val))
colorDict[x.label!] = val
}
}
答案 3 :(得分:1)
这是一个简单的解决方案:
var colorDict = [String: Any?]()
for x in Mirror(reflecting: cl).children.makeIterator() {
if let val = x.value, val != nil {
print(type(of: val))
colorDict[x.label!] = val
}
}
在打印并添加val之前,先检查val是否与nil不同。正如您的输出在控制台日志中建议您打印:
Optional<String>
Optional<Int>
Optional<String>
val是可选的。所以,如果它没有,就不会被添加。如果没有,你输入if语句就可以了。