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对象。