Swift中guard var语句为对象赋值nil报错的替代方案咨询
Swift中Optional绑定变量无法赋值nil的替代方案
先来看你遇到的这个问题场景,代码如下:
class Test1<T> { func demo(_ obj0: Test1<T>?) { guard var obj1 = obj0 else { return } // obj1 = nil // ERROR // WORK AROUND var obj2 = obj0 obj2 = nil // WORKS FINE } }
正如你注释里提到的:直接给obj1赋值nil会报错“Nil cannot be assigned to type 'Test1obj0赋值给新变量obj2后就能正常赋值nil。这本质是因为**guard var obj1 = obj0做的是解包操作**,obj1的类型已经变成了非可选的Test1<T>,而不是可选类型,自然不能赋值nil;但var obj2 = obj0是直接把可选类型的obj0赋值给了同类型的可选变量obj2,所以可以赋值nil。
除了你现在用的临时方案,还有这些替代思路:
显式声明变量类型为可选型
如果你需要在绑定后仍保留可选特性,可以手动声明变量类型,不用依赖类型推断:func demo(_ obj0: Test1<T>?) { guard let temp = obj0 else { return } var obj1: Test1<T>? = temp obj1 = nil // 正常运行 }这里先解包确认
obj0非空,再把它赋值给显式声明为可选类型的obj1,后续就能自由赋值nil了。直接使用原可选变量进行操作
如果你的业务逻辑允许,其实可以直接基于obj0做操作,不需要额外绑定变量:func demo(_ obj0: Test1<T>?) { guard obj0 != nil else { return } var obj1 = obj0 obj1 = nil // 和你的临时方案类似,但省略了解包步骤 }这种方式跳过了解包,直接使用可选类型的变量,当然也能赋值
nil。使用Optional的map方法保留可选性
如果你后续需要对解包后的对象做一些操作,又想保留可选性,可以用Optional的链式方法:func demo(_ obj0: Test1<T>?) { var obj1 = obj0.map { $0 } // 保留可选类型 obj1 = nil // 正常运行 }map方法会返回一个可选类型,即使原对象非空,返回的也是包装后的可选值,所以obj1依然是可选类型,可以赋值nil。
内容的提问来源于stack exchange,提问作者Abhishek Thapliyal
相关产品推荐
相关产品推荐

