Q :是否可以在Swift 3中将函数作为函数参数传递?
要重构我的代码,我希望拥有一个全局函数。在此函数的末尾,有一个自定义按钮,其中包含action
参数。
let deleteButton = MIAlertController.Button(title: "cancel",
type: .cancel,
config: getDestructiveButtonConfig(),
action: {
print("completed")
})
我想做的是设置一个函数作为参数的全局函数。
MyGlobalStuff.swift
...
func getButton(_ myFunc: func, _ title: String) {
let deleteButton = MIAlertController.Button(title: title,
type: .cancel,
config: getDestructiveButtonConfig(),
action: {
myFunc // call here the function pass by argument
})
}
由getButton(..)
调用同一类中传递的函数。
MyViewController.swift
...
getButton(myPrintFunc, "cancel")
func myPrintFunc() {
print("completed")
}
这样的事情可能吗?非常感谢帮助。
答案 0 :(得分:11)
是的,您可以将函数/闭包作为另一个函数的参数传递。
这是语法
RichFunction
这里函数func doSomething(closure: () -> ()) {
closure()
}
作为参数接收一个没有参数且没有返回类型的闭包。
您可以使用此语法调用doSomething
doSomething
或使用尾随闭包语法
doSomething(closure: { _ in print("Hello world") })
答案 1 :(得分:10)
假设
typealias Func = () -> Void
你可以这样做:
func getButton(_ title: String, _ myFunc: Func) {
let deleteButton = MIAlertController.Button(title: title,
type: .cancel,
config: getDestructiveButtonConfig(),
action: {
myFunc()
})
}
甚至:
func getButton(_ title: String, _ myFunc: Func) {
let deleteButton = MIAlertController.Button(title: title,
type: .cancel,
config: getDestructiveButtonConfig(),
action: myFunc
)
}
另外,如果你没有注意到,我将闭包移到了参数列表的末尾。通过这种方式,它将允许高级魔法,如:
getButton("X") { … }
而不是
getButton({ … }, "X")
答案 2 :(得分:4)
函数是swift中的第一类,所以你可以像这样传递它们:
func getButton(_ myFunc: () -> Void, _ title: String) {
您需要在类型中指定函数的签名,即参数类型和返回类型