swift中带有可选闭包的参数

swift中带有可选闭包的参数,swift,parameters,closures,optional,Swift,Parameters,Closures,Optional,我使用可选闭包,但找不到传递参数的方法。 到处搜索,尝试了所有的建议,但都没有成功 我的代码: func DoAlert(title: String , message: String , actions: String , sender: AnyObject? , Ctlr : UIViewController , SegueString: String? , YesClosure: ()->() = {} , NoClosure:

我使用可选闭包,但找不到传递参数的方法。 到处搜索,尝试了所有的建议,但都没有成功

我的代码:

func DoAlert(title: String
    , message: String
    , actions: String
    , sender: AnyObject?
    , Ctlr : UIViewController
    , SegueString: String?
    , YesClosure: ()->() = {}
    , NoClosure: ()->() = {}
    , StartClosure: ()->() = {}
    , EndClosure: ()->() = {}
    ) {

if (actions.rangeOfString("Ok") != nil {
        alert.addAction(UIAlertAction(title: "OK", style: .Default ) { action -> Void in
            EndClosure()
            })}
} // end function
我想为Ok添加一个闭包,其中需要'self'参数

如下所示:

    // add to func doAlert: 
    , OkClosure: (AnyObject)->() = {}


            // add to action Ok (before the EndClosure: 
            OkClosure(sender!)
在第一行上获取错误: AnyObject不是()的子类型

如果我将任何对象保留在第一行之外,则出现错误: 无法将表达式的类型“AnyObject”转换为类型“()=>()”

所有其他试验都给了我类似的“元组”错误。
如何对代码中可选闭包中的参数传递进行编码?

首先,要将闭包用作函数的参数,您应该这样声明它们:

func myFunc(closure: (Int) -> Void) {
    // Now I can call closure like so:
    let myInt = 10
    closure(myInt)
}
(正如@Airspeed Velocity所指出的,
Int
周围的括号不是严格要求的,因为只有一个参数。是否包含它们只是个人偏好)

其次,您可以修改前面的函数以包含可选的闭包,如下所示: (注意,
和闭包周围的括号表示闭包是可选的,而不是返回类型)

第三,要添加一个默认值nil,这看起来像是您在
YesClosure:()->()={}
末尾尝试使用的
={}
,您可以执行以下操作:

func myFunc(closure: ((Int) -> Void)? = nil) {
    // Still need to make sure it's not nil.
    if let c = closure {
        c(10)
    }
}
最后,请注意,您可以设置闭包参数的名称,这样可以更容易地识别调用闭包时传递给闭包的内容。例如:

(注意-此处需要括号括起
值:Int

最后,您可以使用
typealias
。根据文件:

类型别名声明将现有类型的命名别名引入程序

下面是一个如何将其与闭包一起使用的示例:

typealias MyClosureType = () -> Void

func myFunc(closure: MyClosureType) {
    closure()
}

希望有帮助

我想我找到了。调用func时,无法在闭包中使用参数。在func本身中,我需要定义所使用的参数(closure:(sender:AnyObject)->Void),确保变量已定义(或作为单独的参数提供),并将它们添加到closure调用中

@IBAction func buttonPressed(sender: AnyObject) {
    myFunc (sender, doClosure)
}

func myFunc(sender: AnyObject, closure: (sender: AnyObject) -> Void) {
    // Now I can call closure like so:
    closure (sender: sender)
}

func doClosure(sender: AnyObject) {
    println("sender = \(sender)")
}

稍微好一点:
YesClosure:(()->())?=nil
然后像这样使用:
YesClosure?()
(仅在设置时运行)。参数、变量和实例也要使用小写字母大小写。
DoAlert
可能有太多的参数。当您有一个包含10个参数的方法时,不可能编写干净的代码,更糟糕的是,其中四个是closures.nhgrif。我能看到你的观点。然而,DoAlert可以在我想要模拟VB“MessageBox”.nhgrif的任何地方创建干净的代码。因此,我可以使用固定数据(标题、消息等)调用该函数,并具有可选的闭包。作为可选的,我可以不使用闭包。因此,它可能看起来“不干净”,在调用函数时,它比在任何地方编写警报都要干净得多。另外,在有开始警报和结束警报时,我可以简单地在开始和选择后执行功能,例如根据严重程度设置背景颜色(红色表示警报,绿色表示味精)。EndAlert将重置它。vrwim。按照您的建议更改了闭包。和我说的一模一样。假设你的方式更“快速”!!关于camelcause,我一直使用大写camelcause,甚至不知道小写camelcause(以及明显的标准)。我从来没有用C语言编程(case似乎很重要),作为一个恐龙,从Cobol开始,我有一个习惯,总是从C语言开始。实际上更多的是用来强调分离,但是发现Camelling更好,现在单词越来越长,更具解释性。在“区分大小写”Swift中,请尽量遵守!回答得好!但有一件事,当你说“当使用闭包作为函数参数时,你需要确保你把它们括在括号里”,你真的不需要这样做(当然,这只会增加混乱)除非你想把整个闭包标记为可选。这很酷,我还没意识到你可以这么做!我同意,没有额外的括号可以消除混乱。我会相应地修改我的答案。你也可以在单个参数周围去掉括号(即
Int->Void
而不是
(Int)->Void
)虽然这更多的是个人偏好(我更喜欢)。ABakerSmith,Thanx为所有的解释。仍然相信我们遗漏了一些东西。我无法使用包含参数的闭包调用myfunc。您得到了什么错误?闭包中参数的参数类型是什么?
typealias MyClosureType = () -> Void

func myFunc(closure: MyClosureType) {
    closure()
}
@IBAction func buttonPressed(sender: AnyObject) {
    myFunc (sender, doClosure)
}

func myFunc(sender: AnyObject, closure: (sender: AnyObject) -> Void) {
    // Now I can call closure like so:
    closure (sender: sender)
}

func doClosure(sender: AnyObject) {
    println("sender = \(sender)")
}