存储可选返回nil

时间:2015-12-11 23:49:12

标签: ios swift

我想更多澄清Swift 1.2中的选项,例如下面的代码段

var numbers : [Array<String?>?]? = []
var getContact: String?

self.getContact = numbers![indexPath.row]?.first!

println(numbers![indexPath.row]?.first!)
println(getContact)

Optional("1-646-961-1869")
nil

2 个答案:

答案 0 :(得分:1)

SomeType?视为“可能是SomeType类型的值或nil的内容可能会有所帮助。

基于此,您可以阅读:

var numbers : [Array<String?>?]? = []

为:

  

numbers是可能包含数组的变量,或nil。在这部分代码中, 包含一个数组,因为你已经为它分配了[](一个空数组)。该数组包含数组或nil的值。这些数组的每个元素都是Stringnil

nil的含义取决于具体情况。它可能表示失败,或“尚未设置”,或其他。例如,在let maybeInt = Int("foo")中,maybeInt将是Int?(这是Optional<Int>的简写),并且将设置为nil,在这种情况下nil表示"foo"无法转换为数字。在某些其他语言中,您可能会获得异常,或者数字0或-1,或者第二个参数可能用于指示失败,但Swift使用选项。

选项可能被滥用。例如,可选数组通常是可疑的 - 通常一个空数组就足够了。如果您选择使数组成为可选数组,请询问“数组为nil和数组为空的情况有什么不同?”。如果没有区别,它可能不应该是可选的,只是一个常规数组。

(如果您使用的库/框架喜欢在没有明确原因的情况下进行这些操作,那么可能表明它不是一个非常好的库)

当你在此处有numbers这样的可选项时,!表示“我知道这是一个可选项,但我不想处理可选项,所以假设它不是{{1}如果是的话,崩溃。“然后,那就严厉地发生冲击。

因此,例如,数组属性nil返回数组的第一个元素,除非数组为空(就像在示例代码中一样),在这种情况下它将返回first。因此,在您的示例中,写nil不会因numbers![something]而崩溃,因为您将数字设置为某个值。但是,如果索引!处的数组为空,numbers!.first!可能会崩溃。

您代码中的许多something通常是另一个不好的标志,通常暗示您(或您的图书馆的作者)不应该制作一些可选项,因为它不是!,或者

表示有失败的情况(有时数组可能为空)

答案 1 :(得分:0)

由于多种原因,这是一个难以回答的问题。首先,这种对期权的使用通常是不受欢迎的,因为它容易出错并且难以理解。其次,我们没有多少背景可供使用。第三,大多数人此时都在使用Swift 2.0,因为它向后兼容。

如果您尝试了解选项的工作原理,您可能会发现my tutorial on Swift optionals有用。