在检查是否为nil之后强制解包?

5

这样做是否被认为是不好的实践呢?

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

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

除了不太易读之外,它应该没问题。 - LinusGeffarth
if let 变量并不是不必要的。你会在 if 语句中使用它。这就是整个意图。 - rmaddy
7
textLabel.text = arrayOfStrings?.first - Leo Dabus
2
@LeoDabus即使这不是问题的答案,但在这种情况下它是最佳解决方案。 - LinusGeffarth
2
将数组声明为非可选项如何?在大多数情况下,一个空数组表示“无数据”已经足够了。 - vadian
显示剩余12条评论
2个回答

4

Is it considered bad practice to do this

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

这不是坏习惯,我有时也会这样做;但这是不必要的,而且有点不寻常,因为这种情况可以使用条件绑定来解决。

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

创建一个if let变量并不是“不必要”的。它是一种优雅的处理方法。你提出的是“不必要”的(而且浪费资源,因为你强制运行时访问self.arrayOfStrings两次)。

根据是否需要在arrayOfStringsnil时停止所有操作,你有两种选择:

你可以使用guard:

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

或者您可以使用条件绑定:
if let arr = self.arrayOfStrings {
    textLabel.text = arr[0]
}

除了提前退出之外,区别在于arr的范围。

因此,尽管在某种程度上这是一个主观问题,但我认为问题在于您对优雅的理解。


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]
}

在这些情况下,"extra"变量都不会浪费任何精力或内存。 它以只读的方式作为常量使用,Swift 足够聪明,不需要在过程中创建一个完整的数组副本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接