Ios 闭包参数变为零

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

我在验证用户输入时遇到了一个奇怪的问题。我正在为表单框架使用包装器,我希望它能够验证用户输入。 问题是,当我使用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,


如果我运行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]