Ios 闭包参数变为零
我在验证用户输入时遇到了一个奇怪的问题。我正在为表单框架使用包装器,我希望它能够验证用户输入。 问题是,当我使用userValue参数调用闭包时,它最终为nil,并且所有检查都返回false:Ios 闭包参数变为零,ios,swift2,Ios,Swift2,我在验证用户输入时遇到了一个奇怪的问题。我正在为表单框架使用包装器,我希望它能够验证用户输入。 问题是,当我使用userValue参数调用闭包时,它最终为nil,并且所有检查都返回false: class FormRowWrap { var tag: String var row: AnyObject var verification: (value: Any?) -> Bool init(tag: String, row:AnyObject, verifi
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,
如果我运行rowrap.verification(value:“test”),它将返回true,因此我认为这是关于正确展开值的问题。找到了一种方法,通过强制展开“userValue”使其工作: 让entryIsValid=rowrap.verification(值:userValue!)
我仍然不明白为什么这样做,为什么它不能与包装可选的参数一起工作。您的函数需要一个可选的,但是
userValue
在另一个可选的参数中是可选的:
可选(可选(“Ghh”))
所以,当你用
let entryIsValid = rowWrap.verification(value: userValue!)
实际情况是,您展开第一层并返回可选的:
可选(“Ghh”)
你的函数签名是什么
(value: Any?) -> Bool
需要
关于为什么要包装两次:
与
FormValuesRevalid(值:[字符串:任何?])
values
字典中的值是可选值,当您访问字典时:
let userValue = values[rowWrap.tag]
您还可以得到另一个可选值-因为访问字典总是返回可选值,所以在本例中,values[rowrap.tag]
返回“可选”
然后在其他地方打开一次,你认为如果让thing=value as,你会得到值
?字符串
但您得到的是内部可选项,而您的下一次检查失败。谢谢您的回答!
let userValue = values[rowWrap.tag]