Ios 存储可选返回值为零

Ios 存储可选返回值为零,ios,swift,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 var编号

我想进一步澄清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
var编号:[数组?]?=[]
var getContact:String?
self.getContact=number![indexPath.row]?。首先!
println(数字![indexPath.row]?.first!)
println(getContact)
可选(“1-646-961-1869”)
无

这是一个很难回答的问题,原因有很多。首先,人们通常不赞成使用optionals,因为它容易出错,而且很难理解。第二,我们没有太多的合作环境。第三,目前大多数人都在使用Swift 2.0,因为它向后兼容


如果您试图理解optionals是如何工作的,您可能会发现它很有用。

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

基于此,您可以阅读以下内容:

var numbers : [Array<String?>?]? = []
var编号:[数组?]?=[]
作为:

numbers
是可能包含数组的变量,或
nil
。在代码的这一部分中,它确实包含数组,因为您分配了
[]
(空数组)数组包含的值可以是数组,也可以是
nil
。这些数组的每个元素可以是
字符串,也可以是
nil

nil
的含义取决于上下文。它可能表示失败、或“尚未设置”或其他。例如,在
中,让maybeInt=Int(“foo”)
maybeInt
将是
Int?
(这是
可选
的缩写),并将设置为
nil
,在这种情况下,
nil
表示
“foo”
不能转换为数字。在某些其他语言中,您可能会得到异常,或者数字0或-1,或者第二个参数可能用于指示失败,但Swift使用选项

Optionals可能被过度使用。例如,可选数组通常是可疑的–通常空数组就足够了。如果您选择将数组设置为可选数组,请询问“数组为
nil
与数组为空有什么不同?”。如果没有区别,它可能不应该是可选的,而应该是常规数组

(如果您正在使用的库/框架喜欢在没有明确原因的情况下访问这些东西,这可能表明它不是一个很好的库)

当你在这里有一个像
numbers
这样的可选项时,
的意思是“我知道这是一个可选项,但我不想处理可选性,所以只要假设它不是
nil
,如果是,就崩溃。”崩溃得很厉害,就在那里,就在那时

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


你的代码中有很多
通常是另一个不好的标志,通常表明你(或你的库的作者)不应该做一些可选的东西,因为它从来都不是
nil
,或者存在故障情况(比如有时数组可能是空的)您正在忽略的。

尝试在SO上发布自包含的代码。这意味着,我们可以复制和粘贴代码,并且对我们的工作方式与对您的工作方式相同。您真的需要一个可选数组,其元素是可选字符串的可选数组吗?是的,我正在使用这个库,真的,没有理由使用比最新Swift更少的任何内容。(真的,如果你发现一些只使用“旧Swift”的古代图书馆——现实地说,忘了它吧,如果它甚至不能与当前的Swift一起使用,“没有图书馆”。)