检查是否为零后强制展开?

时间:2018-07-30 17:24:56

标签: swift

这样做是否被认为是不好的做法

我正在检查数组是否为nil,然后强制展开以从数组中检索元素。我这样做是为了避免创建不必要的if变量。

if self.arrayOfStrings != nil{
    textLabel.text = self.arrayOfStrings![0]
}

2 个答案:

答案 0 :(得分:4)

是的,这是不好的做法。也许不是在这种情况下专门,但是其他线程可能会更新该属性,并使该属性在检查nil的线程之间变为零,然后强制展开。

只需:

if let arrayOfStrings = self.arrayOfStrings {
    textLabel.text = arrayOfStrings[0]
}

这里没有多余的变量,因为您实际上在if let内部使用了变量。

当然,在这种非常特殊的情况下,尝试获取可选数组的第一个值,您只需执行以下操作:

textLabel.text = self.arrayOfStrings?.first

如果您实际上想要索引0以外的内容,则应检查索引:

if let arrayOfStrings = self.arrayOfStrings, someIndex < arrayOfStrings.count {
    textLabel.text = arrayOfStrings[someIndex]
}

在所有这些情况下,“额外”变量都不是浪费精力或记忆。它以只读方式用作常量,并且Swift足够聪明,因此无法在该过程中创建数组的完整副本。

答案 1 :(得分:3)

  

这样做是否被认为是不好的做法

if self.arrayOfStrings != nil{
    textLabel.text = self.arrayOfStrings![0]
}

不错的做法,我有时会这样做;但这是不必要的,而且有点不寻常,因为这种情况旨在解决条件绑定。

  

我正在检查数组是否为nil,然后强制展开以从数组中检索元素。我这样做是为了避免创建不必要的if变量。

“创建if let变量”不是“不必要的”。这是处理此问题的优雅方法。您提议的 是“不必要的”(这很浪费,因为您要强迫运行时两次访问self.arrayOfStrings)。

您有两种选择,取决于arrayOfStringsnil时是否需要停止一切。

您可以设置警卫:

guard let arr = self.arrayOfStrings else {return}
textLabel.text = arr[0]

或者您可以使用条件绑定:

if let arr = self.arrayOfStrings {
    textLabel.text = arr[0]
}

(除了提早退出)区别在于arr的范围。

因此,尽管在某种程度上这是一个见解,但我想说的是,这里的问题在于您对优雅的理解。