快速通过与Params关闭

时间:2014-06-13 14:40:54

标签: ios closures block swift

目前我作为一个对象的属性传递一个闭包,该对象不接受参数并且没有返回值,如下所示:

class MyClass {
    var myClosureProperty: (() -> ())? {
            didSet {
                doSomeActionWhenClosureIsSet()
            }
    }
}

var instanceOfMyClass = MyClass()
instanceOfMyClass.myClosureProperty = {
    // do some things here...
}
到目前为止,这很有效。我希望能够在设置此闭包时传入一个参数,以便在MyClass的实例中使用。我正在寻找下面的SOMETHING,虽然我确定的语法不正确:

class MyClass {
    var myClosureProperty: ((newString: String) -> ())? {
            didSet {
                doSomeActionWhenClosureIsSet(newString)
            }
    }

    func doSomeActionWhenClosureIsSet(stringParam: String) -> () {
        // create a button with the stringParam title...
    }
}

var instanceOfMyClass = MyClass()
instanceOfMyClass.myClosureProperty = {("Action")
    exampleFunction()
}

我如何将参数传递给可以在MyClass中使用的闭包 - 即可以在属性本身的didSet部分内使用的值,如第二个示例中那样?

编辑:以下是最终为我工作的内容:

class MyClass {
        var myClosurePropertyWithStringAndAction: (buttonName: String, closure: (() -> ()))? {
            didSet {
                  let buttonTitle = myClosurePropertyWithStringAndAction!.buttonName
                  createButtonWithButtonTitle(buttonTitle)
            }
         }

        func createButtonWithButtonTitle(buttonTitle: String) -> () {
             // here I create a button with the buttonTitle as the title and set
             // handleButtonPressed as the action on the button
        }

        func handleButtonPressed() {
            self.myClosurePropertyWithStringAndAction?.closure()
        }
    }
}

以下是我在实例上调用它的方式:

instaceOfMyClass.myClosurePropertyWithStringAndAction = ("Done", {
    // do whatever I need to here
})

3 个答案:

答案 0 :(得分:8)

由于你试图设置第2个东西,一个闭包和一个按钮名称,你将无法通过一个简单的setter来完成闭包。

你所拥有的约束是这两件事彼此依赖,所以你必须设置两者或不设置。

首先,将newString添加到您的闭包中并不是按照您的想法进行的。它是一个参数,所以当你调用它时你可以将一个字符串传递给你的闭包,当你定义闭包时,不是一种传递字符串的方法。

执行你想要的“快速方式”可能是将它定义为元组。您可以在元组内命名值,以便它可以按您的需要工作。试试这样:

class MyClass {
    var stringAndClosure: (buttonName: String,closure: (() -> ()))? {
        didSet {
            //create button named buttonName
            let name = stringAndClosure!.buttonName
        }
    }
}

let instanceOfMyClass = MyClass()
instanceOfMyClass.stringAndClosure =  ("Action",{ exampleFunction() })

答案 1 :(得分:4)

您应该使用in关键字在闭包中传递参数

{ (someString: String) -> Bool in
    //do something with someString
    return true
}

答案 2 :(得分:2)

不要以为可能......你可以这样做:

class MyClass{
    var myClosureProperty: (() -> String)?
    {
        didSet
        {
            doSomeActionWhenClosureIsSet(myClosureProperty!())
        }
    }
    func doSomeActionWhenClosureIsSet(stringParam: String) -> ()
    {
        println("it worked: " + stringParam) // hopefully this would print "it worked: SUCCESS"
    }
}