Array struct def是:
struct Array<T> : MutableCollection, Sliceable {
typealias Element = T
var startIndex: Int { get }
var endIndex: Int { get }
subscript (index: Int) -> T
func generate() -> IndexingGenerator<[T]>
typealias SliceType = Slice<T>
subscript (subRange: Range<Int>) -> Slice<T>
}
而MutableCollection是:
protocol MutableCollection : Collection {
subscript (i: Self.IndexType) -> Self.GeneratorType.Element { get set }
}
然后收集:
protocol Collection : Sequence {
subscript (i: Self.IndexType) -> Self.GeneratorType.Element { get }
}
然后顺序:
protocol Sequence {
typealias GeneratorType : Generator
func generate() -> GeneratorType
}
和Sliceable:
protocol Sliceable {
typealias SliceType
subscript (_: Range<Self.IndexType>) -> SliceType { get }
}
(切片几乎等同于数组)
backstore在哪里?
答案 0 :(得分:0)
这是私人的。它曾经被公开为ArrayBuffer
,但是他们从公共标题中删除了它(我相信在beta 4中)。他们仍然(间接地)暴露了β{4}中_ContiguousArrayBuffer
的存在。
自然的问题是“你为什么想知道?”存储细节不是Array
界面的一部分,因此它们可能会发生变化。请记住,Array
独立于ContiguousArray
,因此几乎任何您认为要对备份存储执行的操作都可能不安全(因为它甚至不会被认为是连续的)
所有那些花哨的东西都说,你实际上可以访问承诺外观的东西,就像支持商店一样。那是withUnsafePointerToElements
。这将为您提供一个指针,允许您进行指针数学运算并获取数组中的元素(就像在C中一样)。 (此方法位于标题中,但不在文档中,因此它可能无法在测试版中存活。)
你也可以将&arrayT
传递给一个带*T
的C函数,它会让它看起来像那里有一块连续的内存块。这是在文档中,所以它更有可能保持真实。