在 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 而不是标准运算符?

在啥情况下我使用 Json 或 Hibernate?

在啥情况下我应该使用尝试而不是二叉树/哈希表? [复制]

在啥情况下为 Qt MinGW 或 MSVC 选择啥编译器?

在啥情况下可以使用指针混合?

带有约束的滚动视图中的iOS Swift stackview