フォームでvalues()を呼び出すと、[String:Any ??]形式のディクショナリが返されるように見えます。ディクショナリの値は、実際にはオプションで2回ラップされています。 それは意図ですか?
私は次のようなフォームを作成しています:
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は、辞書にキーを添えてvalues()
辞書の値型はAny?
values()
、Any ??を返します。
これが最も洗練された解決策ではないことに同意しますが、現在行っているように、values()の結果にnil値を追加する場合の代替手段はありません。
フォームにタグ値として「tagValue」を含む行が含まれていることが完全に確実な場合は、 form["tagValue"]!
を使用できます。
何らかの方法でそれを改善できるかどうか教えてください。
よろしく
values()の結果に「nil」を格納することが重要なユースケースはありますか? 「一致するキーがない」と「そのキーの値がゼロ」をどのように区別できるかはわかりますが、それは重要な違いですか? 実際には、それが重要なケースに遭遇したことはありません。
辞書が作成されているときに値をアンラップするだけでもかまいませんか? そうすると、結果のラッピングは1レベルだけになります。これは、一般的な辞書の動作とより一致しています。
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
}
最も参考になるコメント
私自身のプロジェクトでは、以下のように、値の呼び出しのラップされていないバージョンで拡張機能を追加しています。