我想更多澄清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
答案 0 :(得分:1)
将SomeType?
视为“可能是SomeType
类型的值或nil
的内容可能会有所帮助。
基于此,您可以阅读:
var numbers : [Array<String?>?]? = []
为:
numbers
是可能包含数组的变量,或nil
。在这部分代码中, 包含一个数组,因为你已经为它分配了[]
(一个空数组)。该数组包含数组或nil
的值。这些数组的每个元素都是String
或nil
。
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有用。