Swift/SwiftUI中如何将函数类型用作变量?
当然可以!Swift完全支持将函数类型作为变量传递
在Swift里,函数是一等公民——这意味着你可以把函数当作值来存储、传递,就像处理Int、String这些基本类型一样。你的代码不能运行主要是两个小问题:传递函数时误调用了它,以及没正确声明函数类型。
先修正你的代码
我们一步步来调整:
传递函数引用,而非调用函数:
你原来写的CustomView(incomingFuction: backgroundColorFunction())里,backgroundColorFunction()是直接调用了这个函数,把它的返回值(这里是Void,也就是空值)传了过去。你需要去掉括号,传递函数本身的引用:backgroundColorFunction。正确声明函数类型:
对于无参数、无返回值的函数,它的类型是() -> Void(也可以写成() -> ())。在CustomView里,我们用这个类型来定义属性,还可以给个默认的空闭包避免初始化问题。
修正后的完整代码:
struct ContentView: View { @State var backgroundColor: Color = Color.white func backgroundColorFunction() { backgroundColor = Color.red } var body: some View { ZStack { backgroundColor.ignoresSafeArea() // 去掉括号,传递函数引用 CustomView(incomingFunction: backgroundColorFunction) } } } struct CustomView: View { // 声明函数类型为 () -> Void,默认值是空闭包 var incomingFunction: () -> Void = {} var body: some View { Button("Update Background Color") { // 调用传递过来的函数 incomingFunction() } } }
再扩展一下:带参数/返回值的函数类型
如果你的函数有参数和返回值,函数类型的写法也很直观:
- 接受
Int参数、返回String的函数,类型是(Int) -> String - 接受两个
String参数、返回Bool的函数,类型是(String, String) -> Bool
举个小例子:
// 定义一个带参数的函数 func greet(name: String) -> String { return "Hello, \(name)!" } // 把函数赋值给变量 var greetingFunction: (String) -> String = greet // 调用这个变量(本质是调用函数) print(greetingFunction("Swift")) // 输出 Hello, Swift!
额外提醒:SwiftUI里的闭包注意事项
如果你的函数/闭包会在视图初始化之后才被调用(比如异步回调),记得给属性加上@escaping标记,告诉Swift这个闭包会“逃逸”当前的作用域:
struct CustomView: View { // 逃逸闭包 var incomingFunction: @escaping () -> Void = {} // ... 其他代码 }
内容的提问来源于stack exchange,提问作者user14677112
相关产品推荐
相关产品推荐

