swift 中带有可选闭包的参数
parameters with optional closures in swift
我正在使用可选闭包,但找不到传递参数的方法。
到处搜索,尝试了所有建议,但无法正常工作。
我的代码:
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 放在第一行之外,则会出现错误:
无法将表达式的类型 'AnyObject' 转换为类型“() => ()”
所有其他试验都给我类似的 'Tuple' 错误。
如何在我的代码中对可选闭包中的参数传递进行编码?
首先,要使用闭包作为函数的参数,您应该像这样声明它们:
func myFunc(closure: (Int) -> Void) {
// Now I can call closure like so:
let myInt = 10
closure(myInt)
}
(正如@Airspeed Velocity指出的,Int
两边的括号并不是必须的,因为只有一个参数。是否包含它们只是个人喜好)
其次,您可以修改前面的函数以包含一个可选的闭包,如下所示:
(注意闭包周围的 ?
和括号表示闭包是可选的,而不是 return 类型)
func myFunc(closure: ((Int) -> Void)?) {
// Now when calling the closure you need to make sure it's not nil.
// For example:
closure?(10)
}
第三, 添加一个默认值 nil,这就是您尝试对 [= 末尾的 = {}
执行的操作18=],你可以这样做:
func myFunc(closure: ((Int) -> Void)? = nil) {
// Still need to make sure it's not nil.
if let c = closure {
c(10)
}
}
最后,提醒一下,你可以设置闭包的参数名称,这样可以更容易地识别你传递给闭包的是什么调用它。例如:
(注意 - 这里需要括号 value: Int
)
func myFunc(closure: ((value: Int) -> Void)) {
closure(value: 10)
}
最后,你可以使用typealias
。根据文档:
A type alias declaration introduces a named alias of an existing type into your program.
这是一个如何将它与闭包一起使用的示例:
typealias MyClosureType = () -> Void
func myFunc(closure: MyClosureType) {
closure()
}
希望对您有所帮助!
我想我找到了。调用 func 时不能在闭包中使用参数。在 func 本身中,我需要定义使用的参数 (closure: (sender: AnyObject) -> Void),确保变量已定义(或作为单独的参数提供)并将它们添加到闭包调用中。
@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)")
}
我正在使用可选闭包,但找不到传递参数的方法。 到处搜索,尝试了所有建议,但无法正常工作。
我的代码:
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 放在第一行之外,则会出现错误: 无法将表达式的类型 'AnyObject' 转换为类型“() => ()”
所有其他试验都给我类似的 'Tuple' 错误。 如何在我的代码中对可选闭包中的参数传递进行编码?
首先,要使用闭包作为函数的参数,您应该像这样声明它们:
func myFunc(closure: (Int) -> Void) {
// Now I can call closure like so:
let myInt = 10
closure(myInt)
}
(正如@Airspeed Velocity指出的,Int
两边的括号并不是必须的,因为只有一个参数。是否包含它们只是个人喜好)
其次,您可以修改前面的函数以包含一个可选的闭包,如下所示:
(注意闭包周围的 ?
和括号表示闭包是可选的,而不是 return 类型)
func myFunc(closure: ((Int) -> Void)?) {
// Now when calling the closure you need to make sure it's not nil.
// For example:
closure?(10)
}
第三, 添加一个默认值 nil,这就是您尝试对 [= 末尾的 = {}
执行的操作18=],你可以这样做:
func myFunc(closure: ((Int) -> Void)? = nil) {
// Still need to make sure it's not nil.
if let c = closure {
c(10)
}
}
最后,提醒一下,你可以设置闭包的参数名称,这样可以更容易地识别你传递给闭包的是什么调用它。例如:
(注意 - 这里需要括号 value: Int
)
func myFunc(closure: ((value: Int) -> Void)) {
closure(value: 10)
}
最后,你可以使用typealias
。根据文档:
A type alias declaration introduces a named alias of an existing type into your program.
这是一个如何将它与闭包一起使用的示例:
typealias MyClosureType = () -> Void
func myFunc(closure: MyClosureType) {
closure()
}
希望对您有所帮助!
我想我找到了。调用 func 时不能在闭包中使用参数。在 func 本身中,我需要定义使用的参数 (closure: (sender: AnyObject) -> Void),确保变量已定义(或作为单独的参数提供)并将它们添加到闭包调用中。
@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)")
}