Eureka: values() 返回双选项?

创建于 2015-11-11  ·  3评论  ·  资料来源: xmartlabs/Eureka

看起来在表单上调用 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,它仍然是一个可选的。 这看起来很尴尬。 有没有理由以这种方式嵌套,还是这是一个错误?

最有用的评论

对于我自己的项目,我正在添加一个扩展,其中包含值调用的解包版本,如下所示。

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
    }

所有3条评论

@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
    }
此页面是否有帮助?
0 / 5 - 0 等级