我有这样的代码
Field to check
如上所述,如果将nil指定给obj1,则显示错误
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
}
}
但是,如果我为它分配另一个变量并指定nil它可以正常工作。
我搜索并找到了这个:https://stackoverflow.com/a/30613532/5589073
那么我该怎么做才能替代这个错误? 我不想要第3个变量并指定nil
答案 0 :(得分:1)
guard var obj1 = obj0
表示obj1
的类型为obj0
的展开类型,即obj1
的类型将为Test1<T>
而不是Test1<T>?
。因此,无法为其分配nil
。
另一方面,swift编译器将obj2
的类型推断为Test1<T>?
。因此可以为其分配nil
。
<强>更新强>:
您可以删除guard语句并改为使用if
语句。然后使用obj1
分配obj0
。编译器会将obj1
的类型推断为与obj0
if obj0 == nil { return }
var obj1 = obj0
答案 1 :(得分:1)
guard let
展开一个可选值,这意味着如果值不是nil,它会将一个可选值转换为非可选值。这就是您无法将nil
分配给obj1
如果您想保留obj0
的可选性,请不要将其打包到obj1
,只需检查是否为
guard obj0 != nil else { return }
var obj1 = obj0
或者,您可以保留obj0
并隐藏它:
var obj0 = obj0
guard obj0 != nil else { return }