Swift:如何在函数参数闭包中设置闭包?报错求解
Swift闭包属性初始化导致的类型歧义问题解决
想要实现的调用方式
func test() { MyClass().setup { $0.testClosure = { print("1 closure called") } $0.test2Closure = { print("2 closure called ") } } }
尝试代码及报错
尝试的MyClass实现代码:
class MyClass { var testClosure: (() -> Void) var test2Closure: (() -> Void) func setup(_ setup: ((_ controller: MyClass) -> Void)) { setup(self) } }
运行时出现错误:表达式类型不明确,需要更多上下文
问题原因与解决方案
你的写法思路是可行的,报错的核心原因是类的存储属性必须有明确的初始值:
- Swift要求类的非可选存储属性必须在初始化阶段完成赋值,否则编译器无法确定属性的初始状态,进而导致类型推断失败。
有两种修改方式可以解决这个问题:
方式1:给闭包属性设置默认空实现
class MyClass { var testClosure: (() -> Void) = {} var test2Closure: (() -> Void) = {} func setup(_ setup: ((_ controller: MyClass) -> Void)) { setup(self) } }
方式2:将闭包属性声明为可选类型
class MyClass { var testClosure: (() -> Void)? var test2Closure: (() -> Void)? func setup(_ setup: ((_ controller: MyClass) -> Void)) { setup(self) } }
修改完成后,你原本的test()调用代码就能正常运行,实现预期的闭包配置功能。
内容的提问来源于stack exchange,提问作者Gorthez
相关产品推荐
相关产品推荐

