作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在一个类中有一个实例变量,它可能没有值,所以它被定义为一个可选的:
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/
我是一名优秀的程序员,十分优秀!