我有一个奇怪的问题,试图验证用户输入。我正在使用表单框架的包装器,我希望它能够验证用户输入。 问题是,当我使用userValue参数调用闭包时,它最终为nil并且所有检查都返回false:
class FormRowWrap {
var tag: String
var row: AnyObject
var verification: (value: Any?) -> Bool
init(tag: String, row:AnyObject, verification:(Any?) -> Bool) {
self.tag = tag
self.row = row
self.verification = verification
}
}
class InsertViewController: FormViewController {
let rows = [
{
let tag = "Fuel Name"
let row = FormRowWrap(tag: tag,
row:TextRow(tag) {
$0.title = tag
// $0.value = last known user default
},
verification:({(value: Any?) -> Bool in
if let thing = value as? String {
//^----- the value in a **breakpoint here is nil**
//
if !thing.isEmpty {
return true
}
}
return false
}))
return row
}() as FormRowWrap,
{
let tag = "Price"
let row = FormRowWrap(tag: tag,
...
func formValuesAreValid(values: [String: Any?]) -> Bool {
var result = false
for rowWrap in self.rows {
let userValue = values[rowWrap.tag]
print("userValue \(userValue) forTag: \(values[rowWrap.tag])")
// ^---- this prints userValue **Optional(Optional("Ghh")) forTag: Optional(Optional("Ghh"))**
let entryIsValid = rowWrap.verification(value: userValue)
if (!entryIsValid) {
result = false
return result
}
}
result = true
return result
}
如果我运行rowWrap.verification(value:“test”),它返回true,所以我认为这是关于正确展开值的问题。
答案 0 :(得分:0)
通过强行解开“userValue”找到一种方法使其工作:
让entryIsValid = rowWrap.verification(value:userValue!)
我仍然不明白为什么这样做以及为什么它不能作为包装可选参数使用。
答案 1 :(得分:0)
您的功能需要一个可选,但userValue
是另一个可选内的可选:
optional(可选( “GHH”))
所以当你强行用
打开它时let entryIsValid = rowWrap.verification(value: userValue!)
实际上发生的事情是您打开第一层并返回一个Optional:
可选( “GHH”)
这是你的功能签名
(value: Any?) -> Bool
的需求。
关于为什么它被包裹两次:
与
formValuesAreValid(values:[String:Any?])
values
字典中的值是Optionals,然后当您访问字典时:
let userValue = values[rowWrap.tag]
你得到另一个可选 - 因为访问字典总是返回一个Optional,所以在这种情况下values[rowWrap.tag]
返回一个“Optional Optional”。
然后在其他地方解开,一旦认为你会得到值if let thing = value as? String
,但你得到内部的可选,而你的下一次检查失败。