在guard var语句中将nil赋值给object

时间:2018-03-22 04:04:44

标签: swift generics

我有这样的代码

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

2 个答案:

答案 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 }