Swift Array Design(2014)

2021-03-22 08:43:58

tt {背景颜色:#f2f2f2; div.Content UL>李{背景:无;填充:0 0 0 0.5EM;列表样式图像:无;列表样式类型:光盘;}}:链接{颜色:#ab6023;字体重量:正常}正常}相当于下标get / set的C阵列的性能是最重要的表现目标。

应该可以从CocoA接收NSArray,表示它作为数组< aforobject>,并将其转回tococoa作为o(1)中的nsArray,没有内存分配。

阵列应该可以使用堆栈,因此我们要摊销O(1)ampendand o(1)popach。与目标#1一起,这意味着STD :: vector-lible布局,保留尾部存储器容量可以超过实际存储元素的数量。

为了达到目标1和2,我们使用静态知识所以静态知识类型:当静态已知元素类型是NOTA类时,代码和检查会考虑包装NSARRAY的可能性。一系列SWIFT值类型总是最有效的表示表示,与TominigureArray相同。

SWIFT提供了三种通用数组类型,所有这些都具有amortizedo(1)的增长。在本文档中,关于ArrayType的语句适用于所有三个组件。

Contegulearray<元素>当你需要的时候是三个 - useThis的最快和最简单的" c array"表现。关节阵列的元素始终在内存中连续存储。

数组<元素>就像关节阵列<元素>,但是从可可和背部进行了优化的前置机转换 - 当元素可以是classtype,array<元素>可以由任意NsArray的(潜在的非连续)存储来支持,而不是通过SWIFT Contigulearray来支持。数组<元素>还支持相关类类型的相关类阵列上下游。当已知元素是Anon-Class类型时,阵列的性能<元素>与Compitulearray<元素>。

arrayslice<元素>是某些阵列<元素&gt的子范围;或关连阵列<元素&gt ;;它' s使用切片表示法的结果,例如。任何SWIFT阵列a上的[7 ... 21]。切片始终具有张有的储存和" c array"表现。切片ArrayType是O(1),除非源是数组<元素>支持' t提供连续存储的NSArray。

建议为瞬态计算,但不符合术语存储。由于它引用了一些共享缓冲区的子范围,因此arrayslice可以人工延长亚拉丝本身外部的寿命。

每个类类型或@objc存在(例如AnyObject)桥接到Objective-C并通过当Iidentity转换桥接到SWIFT,即它桥接逐字。

不桥接逐字的类型T可以符合BridgedToObjectivec,它将其转换与fromObjectIvec指定:

协议_BridgedToObjectivec {typeAleias _Objectivectype:AnyObject Func _bridgetoObjectivec() - > _objectivectype类func _forcebridgefromobjectivec(_:_objectivectype) - >自己}

类和@objc存在性不应符合_bridgedtoObjectIvec,这是一个在编译时无法定时的限制。

某些通用类型(arrayType< t>特别是)kidebjective-c ockobjective-c ock。这些类型符合_conditionallyBridgedToObjectIvec:

协议_conditionallyBridgedToObjectivec:_bridgedtoObjectivec {class func _isbridgedtoObjectivec() - > BOOL Class Func _conditionallyBridgeFromObjectIvec(_:_Objectivectype) - >自己?}

桥接或桥接回到符合_conditionallbridgedToObjectivec(当T._IsbridgedToObjectivec()为false时的T型T是一个用户编程,可以诊断atruntime。 _ConditionallyBridgridFromObjectIvec可用于尝试桥接,如果整个对象无法牢记,则返回nil。

然后,T类型的值x通过x._bridgetoObjectivec()桥接为t._objectivectype,并且将t._objectivectivectivectype的对象y桥接回T通过t._forcebridgefromobjectivec(y)

从这里开始,本文档仅处理数组本身,而不是切片或关节array,这支持阵列和#39; s转换的子集。未来的修订将添加Sliceand Contiguving array转换的描述。

在这些定义中,基础是AnyObject或级别的子类型,导出是基础的琐碎子类型,以及_bridgedToObjectec的Xconforms:

琐碎的桥接隐式地将[基本]转换为o(1)中的nsArray。这只是返回TheArray' s内部缓冲区的问题,即它是一个nsarray。

琐碎的桥接背面隐式地将NSArray转换为O(1)中的[AnyObject]加上NSArray上调用Copy()的成本。 [1]

可以将任一类型的隐式转换组合在隐式转换到NSArray中,可以与普通桥接组合。

检查桥接返回将[t]转换为[x]?其中x._objectivectype是t或其琐碎的子类型。

强制转换将[AnyObject]或NSArray Implication地转换为[T],在SWIFT和Objective-C之间的桥接Thunks中。

例如,当用户写入SWIFT方法时,将[NSVIEW]拍摄时,它被暴露于Object-C,以便在Objective-C调用时使用NSArray的方法,该方法转换为[NSView]。

强制转换,其中任何元素都无法转换,例如可以陷阱的用户编程错误。在强制播放的情况下,陷阱可能被推迟到访问违禁的程度。

检查和强制衰落都可以与NSArray的转换中的琐碎桥式组合。

当上施加[派生]到[Base]时,派生对象的缓冲器可以简单地是不安全的BITCAST'编辑到类型基础的BUFFEROF - 只要从未介绍生成的缓冲区。例如,我们不能允许基本元素在缓冲区中捕食,因为缓冲区' s析构函数将摧毁它们具有衍生类型的(不正确)静态推定的元素。

此外,我们可以' t(逻辑上)只能在突变之前复制缓冲区,因为可以在突变之前复制[基础],并且我们的共享下标分配语义意味着所有复制符号遵守其下标作业。

因此,将[t]转换为[U]是类似的,:新阵列变为逻辑上独立。为了避免立即O(n)转换成本,并保留共享的Subscriptassigmment语义,我们在数据结构中使用一层间接。此外,当T是U的子类时,标记为防止缓冲的原始突变;它将被复制在第一个突变之上:

在强制沮丧中,如果任何元素未能导出动态类型,则它被视为可能导致陷阱的编程错误。有时我们可以在O(1)中进行此检查,因为源持有已知的BufferType。而不是引起O(n)检查其他情况,Newintermediate对象被标记为延期检查,并且通过该对象的所有ExpertyAccess都是动态打印的,具有Trapupon失败(在-OUNCHECKED构建中除外)。

当由此产生的阵列稍后推动(除了通过检查底层缓冲器的类型以O(1)中验证的类型),结果也标记为延迟检查。

如果已知已知是不可变的,则此副本()可能会纳入保留。如果我们可以检测到NSArray无唯一参考,我们最终可以优化副本。但是,我们目前的唯一参考检测仅适用于TOSWIFT对象。