升级Xcode14.3与Swift5.8后,guard let self语法报错,该语法是否失效?
Swift 5.8中
[weak self]配合guard let self的语法问题解答 你之前使用的代码:
button.tapHandler = { [weak self] _ in guard let self else { return } self.dismiss() }
在Swift 5.8(Xcode 14.3)中确实无法再使用,编译器抛出的错误:
implicit use of
selfin closure; useself.to make capture semantics explicits
这是因为Swift 5.8收紧了闭包中self捕获的语法检查规则,原来省略= self的隐式解包写法被判定为捕获语义不明确,因此必须显式写出解包语句。
正确的写法有两种:
- 显式写出
self = self完成弱引用转强引用:
button.tapHandler = { [weak self] _ in guard let self = self else { return } self.dismiss() }
- 为解包后的实例起别名(比如
strongSelf):
button.tapHandler = { [weak self] _ in guard let strongSelf = self else { return } strongSelf.dismiss() }
两种写法都能明确捕获语义,通过Swift 5.8的编译检查,其中第一种写法保留了self的命名,更符合日常编码习惯。
内容的提问来源于stack exchange,提问作者Suprie
相关产品推荐
相关产品推荐

