看起来在表单上调用 values() 会返回一个 [String: Any??] 形式的字典,其中字典中的值实际上是可选的,包装了两次。 这是意图吗?
我正在制作这样的表格:
form +++ Section("New Class")
<<< TextRow(labelTag){ $0.title = "Class Name" }
<<< PushRow<ClassGroup>(groupTag) { row in
row.title = "Age Group"
...
}
然后访问这些值...
let values = form.values()
let label = values[self.labelTag]! // label is still an optional
let group = values[self.groupTag]! // group is still an optional
如果我明确地解开 labelTag,它仍然是一个可选的。 这看起来很尴尬。 有没有理由以这种方式嵌套,还是这是一个错误?
@jaylyerly在 swift 中如果我们用一个键对字典进行下标,它返回一个可选类型,因为values()
字典的值类型是Any?
它返回一个 Any??。
我同意这不是最优雅的解决方案,但在我们像现在所做的那样将 nil 值添加到 values() 结果的情况下,我没有其他选择。
如果您完全确定表单包含以“tagValue”作为标记值的行,则可以使用form["tagValue"]!
。
让我知道我们是否可以以某种方式改进它。
问候
是否存在在 values() 结果中存储“nil”很重要的用例? 我可以看到这将如何让您区分“没有匹配的键”和“该键的值为零”,但这是一个重要的区别吗? 在实践中,我没有遇到过这很重要的情况。
在构建字典时只解开这些值是否可以接受? 那么你只会得到一个级别的结果换行,这更符合一般字典行为。
使用 XLForms,我发现检查 nil 和 NSNull 的表单值是该过程中最麻烦的部分。 这几乎是同一问题的快速版本。 我很想看到皱纹消失。
对于我自己的项目,我正在添加一个扩展,其中包含值调用的解包版本,如下所示。
public func unwrappedValues(includeHidden includeHidden: Bool = false) -> [String: Any]{
let wrapped = self.values(includeHidden: includeHidden)
var unwrapped = [String:Any]()
for (k,v) in wrapped {
unwrapped[k] = v ?? nil
}
return unwrapped
}
最有用的评论
对于我自己的项目,我正在添加一个扩展,其中包含值调用的解包版本,如下所示。