Array <t>或Slice <t>结构类型理解结构</t> </t>

时间:2014-08-03 16:51:55

标签: swift swiftype

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在哪里?

1 个答案:

答案 0 :(得分:0)

这是私人的。它曾经被公开为ArrayBuffer,但是他们从公共标题中删除了它(我相信在beta 4中)。他们仍然(间接地)暴露了β{4}中_ContiguousArrayBuffer的存在。

自然的问题是“你为什么想知道?”存储细节不是Array界面的一部分,因此它们可能会发生变化。请记住,Array独立于ContiguousArray,因此几乎任何您认为要对备份存储执行的操作都可能不安全(因为它甚至不会被认为是连续的)

所有那些花哨的东西都说,你实际上可以访问承诺外观的东西,就像支持商店一样。那是withUnsafePointerToElements。这将为您提供一个指针,允许您进行指针数学运算并获取数组中的元素(就像在C中一样)。 (此方法位于标题中,但不在文档中,因此它可能无法在测试版中存活。)

你也可以将&arrayT传递给一个带*T的C函数,它会让它看起来像那里有一块连续的内存块。这是在文档中,所以它更有可能保持真实。