SwiftUI自定义MSButton遇'(() -> Void)?'未使用警告,功能失效
问题分析与解决
你的问题源于两个关键错误:
- 闭包未执行:你仅引用了
action变量,但没有调用它,导致闭包代码不会触发,同时因未使用闭包值出现警告。 - 缺少尾随闭包初始化器:你期望的
MSButton { ... }调用方式需要对应的初始化器支持,当前默认初始化器无法直接通过尾随闭包传递action。
修正步骤
- 执行闭包:在内部
Button的action闭包中,需调用可选闭包,用action?()执行闭包内容(?处理闭包为nil的场景)。 - 添加尾随闭包支持:为
MSButton添加适配尾随闭包语法的初始化器,或者将action设为非可选类型绑定。
完整修正代码
非可选action版本(推荐,强制按钮有操作)
struct MSButton: View { // 标记@escaping,因闭包会被存储到视图结构体中 private let action: () -> Void // 初始化器支持尾随闭包调用 init(action: @escaping () -> Void) { self.action = action } var body: some View { Button { // 执行传入的闭包 action() } label: { Text("Button") } } } // 调用方式(与你的期望一致) MSButton { print("hello") }
可选action版本(允许按钮无操作)
struct MSButton: View { private let action: (() -> Void)? // 重载初始化器,同时支持可选闭包和尾随闭包 init(action: (() -> Void)? = nil) { self.action = action } init(action: @escaping () -> Void) { self.action = action } var body: some View { Button { // 调用可选闭包,无操作时自动忽略 action?() } label: { Text("Button") } } }
修改后,警告会消失,点击按钮即可触发你传入的闭包代码。
内容的提问来源于stack exchange,提问作者user19914183
相关产品推荐
相关产品推荐

