gpt4 book ai didi

swift - 可选用 ?在 swift

转载 作者:行者123 更新时间:2023-11-28 09:57:41 25 4
gpt4 key购买 nike

我在一个类中有一个实例变量,它可能没有值,所以它被定义为一个可选的:

var myObject: MyClass?

viewDidLoad() 方法中,我检查 myObject 是否有值,如果有,则使用这些值。但是,Xcode 会自动更正代码以使用 ? 来解包可选,而不是 !

if myObject != nil {
print(myObject?.propertyOne)
print(myObject?.propertyTwo)
}

我很困惑为什么会这样,因为我认为你需要使用 ! 来解包可选值,而 ? 定义了一个可选值。让事情更困惑的是 ! 也可以工作:

if myObject != nil {
print(myObject!.propertyOne)
print(myObject!.propertyTwo)
}

感谢您的帮助。

最佳答案

nil 测试可选值不同于为任何其他值测试它。我认为这就是导致您感到困惑的原因。

例如如果你有 myObject: MyClass?,那么你可以这样做

if myObject != nil { 
// Still have to unwrap myObject to use it, cause it's still an optional.
// But at least you knowat this point that force unwrapping of myObject
// won't fail at runtime.
}

但是你做不到

if myObject != aNonNilValue { 
}

-- 您需要打开包装才能执行后者。

关于您的代码示例,使用 Swift 2 语法做同样事情的更现代的方法是:

if let myObject = myObject
{
// myObject is not an optional in this scope, so no unwrapping needed!
print(myObject.propertyOne)
print(myObject.propertyTwo)
}
else
{
print("oops, myObject is nil!")
}

乍一看这可能有点令人困惑。赋值左边的myObject是一个新变量,它保存着原始myObject的解包值,它不必和可选的it同名从中获取值(value)。如果原始 myObject 为 nil,则 if let 不会执行,它下面的 block 也不会运行。

使用上面的 if let 方法可以帮助避免运行时错误,因为它避免了潜在危险的强制展开操作。

关于swift - 可选用 ?在 swift ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34326198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com