在 Apple Swift 中,在啥情况下我不想要一个隐式展开的可选项?
Posted
技术标签:
【中文标题】在 Apple Swift 中,在啥情况下我不想要一个隐式展开的可选项?【英文标题】:In Apple Swift, in what case(s) would I not want an implicitly unwrapped optional?在 Apple Swift 中,在什么情况下我不想要一个隐式展开的可选项? 【发布时间】:2014-06-17 20:31:34 【问题描述】:我相信我理解为什么可选项很方便(我最好的使用方法是能够返回一个 nil 布尔值),但是在什么情况下我想声明一个包装的可选项 using ?而不是 !对于隐式展开的可选。
似乎没有必要用 ?然后必须输入!到处都是,而不仅仅是使用!一次。
我不想忽略 ?没用,但我就是找不到它的用途……有什么想法吗?
【问题讨论】:
【参考方案1】:如果您尝试访问隐式展开的可选项的内容,但那里没有任何内容,您的应用将会崩溃。
如果您使用模式检查可选内容的内容(例如 optional binding and optional chaining),您可以控制您的应用在不可预见的情况下如何优雅地失败。而且它不会让你的代码变得更复杂。
对我来说,不崩溃似乎是一个很好的理由。
【讨论】:
好的,有道理...感谢您的回答! @Ptemple 因为崩溃了,我想说更好的问题是你什么时候想要使用隐式展开的选项。有一些特定的用例,尤其是在与 Objective-C API 交互时,但除此之外,我会避免它们。【参考方案2】:首先让我们谈谈重点是什么?很快。您可能会创建一个如下所示的 var。
var number : Int?
您基本上是说这个变量有可能为零。如果一个对象有可能是 nil,那么你就不想做这样的事情。
var secondNumber = number! + 5
基本上在你所说的那个陈述中,这个变量有可能是 nil,但是,我会完全忽略这个事实,并假装它不可能是 nil。
相反,您需要先检查该变量是否存在,然后再设置它
var number : Int?
var number2 : Int?
number = 10
if let unwrappedNumber = number
number2 = unwrappedNumber + 5
希望这会有所帮助!
【讨论】:
这是迄今为止我找到的最好的解释。我真的很困惑“?”和 ”!”。谢谢。【参考方案3】:隐式解包的选项会引入类似于取消引用空指针的可能故障。仅当您可以确定没有人会意外传递 nil 时,或者当您愿意告诉接口的客户端如果违反接口要求该函数将崩溃时,才应该使用它们。
另一种避免使用 ?重复的是 if let 语句:
func foo(bar:Int?) -> Int?
if let x = bar
if Int.max / x >= x
return x * x
return nil
x
这里是Int
而不是Int?
。
【讨论】:
我会把这里所有的案例都放在他们的头上,并说这个问题最好通过考虑什么时候来回答(如你的例子) /return/ a ? - 如果返回 nil 是好的设计,那么使用 ? - 事实上,在 Swift 中,这是必不可少的!以上是关于在 Apple Swift 中,在啥情况下我不想要一个隐式展开的可选项?的主要内容,如果未能解决你的问题,请参考以下文章
在啥情况下我应该在 C++ 中使用 memcpy 而不是标准运算符?