Arrays ReverseRandomAccessCollection的`\u base`属性是什么?

Arrays ReverseRandomAccessCollection的`\u base`属性是什么?,arrays,swift,swift3,Arrays,Swift,Swift3,使用\u base属性访问ReverseRadomAccessCollection的元素是否是一种良好的做法 let myArray = [1, 2, 3] print(myArray.first) // returns 1 print(myArray.reversed().first) // returns 3 print(myArray.reversed()._base.first) // return 1, which is the underlying base array 正如在评

使用
\u base
属性访问
ReverseRadomAccessCollection
的元素是否是一种良好的做法

let myArray = [1, 2, 3]
print(myArray.first) // returns 1

print(myArray.reversed().first) // returns 3
print(myArray.reversed()._base.first) // return 1, which is the underlying base array

正如在评论中提到的,最好不要使用
\uuu
方法,不需要这种风险。在Swift 3中,
reversed()
返回wrapper
reversedrandomasccesscollection
以访问数组,就像它被反转一样-无需分配新数组,而
reverse()
变异现有数组:

var myArray = [1, 2, 3]
myArray.reverse()
print(myArray.first) // returns 3
print(myArray.reversed().first) // returns 1
print(myArray.reversed()._base.first) // return 3

注意:您只能在
var
上调用
reverse()
A
ReverseRandomAccessCollection
(您可以看到)是一个简单的包装器,它在底层
RandomAccessCollection
上呈现一个反向视图(这样就不必进行O(n)遍历)

实现这一点的方法是保持基础集合的
\u base
属性,然后实现
RandomAccessCollection
协议,以便在其上呈现反向视图,例如反向索引遍历(注释):

你应该做:

myArray.first

这将产生相同的结果。

我得到不同的结果:
myReversedArray.first
返回3,而
myReversedArray.u base.first
返回1。使用以下划线(
\uu
开头)开头的任何属性或方法时都要非常小心。这些都是未记录的,是为编译器准备的。为什么
myReversedArray。首先
当您使用
myArray
的反向版本初始化它时返回1?抱歉,伙计们,有一个输入错误,我更新了代码。我得到了相同的结果:
13 1
获得1-3-1复制和粘贴您自己的代码。你确定你的跑步方式与这里展示的一模一样吗?什么版本的Swift?
myArray.reversed()._base.first
myArray.first