当前位置:  开发笔记 > IOS > 正文

有没有理由为什么array [index]不返回可选项?

如何解决《有没有理由为什么array[index]不返回可选项?》经验,为你挑选了1个好方法。

我觉得array[index]应该返回一个可选的,因为索引可能超出范围.

这将允许代码,如:

if let object = array[index] {
  // Do stuff
}

使用扩展方法很容易做到这一点,但知道这种情况的真正原因将是很好的.



1> Rob Napier..:

这是我的第一个Swift雷达之一,它被称为"行为正确".它也在开发论坛中讨论过.如Dave Abrahams所述:

至于基本原理,拥有索引在范围内的静态知识是很容易和非常普遍的....在这种情况下,建立索引有效的前提条件要好得多,以便常见的用例不必处理语法上有一个不可能发生的失败.将其与键上的字典索引进行对比,通常不知道键是否已经存在于字典中.

随着我在Swift中的经验越来越丰富,我也同意了.我有时希望内置一个"安全下标"(如Mike Ash的),但我已经同意它不应该是默认的.

将其设为默认值会使Arrays非常难以使用,这不仅仅是因为需要解包,而是因为Index类型不再存在Int.需要subscript(Index)返回Element(不Element?).这就是为什么词典索引不是Key; 它是DictionaryIndex.创建一个特殊的ArrayIndex可能会有很多烦人的副作用.(也许它最终会全部解决,但是否值得这样做是值得怀疑的.)

这里真正的教训是你应该避免任意下标Arrays.在实际应用中,您应该优先使用它作为CollectionType.这意味着仅使用您获取的索引(使用indexOfindices例如)进行订阅,并且强烈支持迭代(for-in,map)而不是下标.使用xs.first而不是xs[0].如果您将其视为集合而不是数组,那么您将获得所描述的安全性,同时在需要解决特殊问题时仍然可以使用下标,其中您知道下标在范围内.

这是一个说明性的例子.考虑这个常见的循环,您可能认为需要下标:

let xs = [1,2,3]

for i in 0..

我们可以做得更好一点,不依赖于我们对数组索引的特殊知识,并使其适用于所有集合:

for i in xs.indices {
    print("\(i): \(xs[i])")
}

但即使这样也没有必要.我们可以做得更好,并使其适用于所有序列:

for (i, x) in xs.enumerate() {
    print("\(i): \(x)")
}

没有下标要求.

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有