如何使用特定容量在swift中初始化数组?
我试过了:
var grid = Array <Square> ()
grid.reserveCapacity(16)
Run Code Online (Sandbox Code Playgroud)
但得到错误
expected declaration
Run Code Online (Sandbox Code Playgroud)
Ben*_*ton 49
怎么样:
class Square {
}
var grid = Array<Square>(count: 16, repeatedValue: Square());
Run Code Online (Sandbox Code Playgroud)
虽然这会调用每个方块的构造函数.
如果您使阵列具有可选的Square实例,则可以使用:
var grid2 = Array<Square?>(count: 16, repeatedValue: nil);
Run Code Online (Sandbox Code Playgroud)
编辑:使用Swift3,此初始化程序签名已更改为以下内容:
var grid3 = Array<Square>(repeating: Square(), count: 16)
Run Code Online (Sandbox Code Playgroud)
要么
var grid4 = [Square](repeating: Square(), count: 16)
Run Code Online (Sandbox Code Playgroud)
当然,两者都可以Square?和nil.
Mer*_*lik 17
Swift 3/Swift 4
var grid : [Square]?
grid?.reserveCapacity(16)
Run Code Online (Sandbox Code Playgroud)
我相信它也可以在一行中实现.
Kva*_*ant 12
var actions:[AnyObject?] = [AnyObject?](count: 3, repeatedValue: nil)
Run Code Online (Sandbox Code Playgroud)
警告:
如果您使用Array(repeating:count:)初始化程序,那么在使用常见的数组方法时,您会遇到奇怪和意外的行为,例如,append(通过在创建的容量之外添加新值而不是数组中较早的点,会立即破坏保留容量的目的。
更好的做法:
Swift 数组会动态加倍以满足数组的存储需求,因此在大多数情况下您不一定需要预留容量。但是,如果您不提前指定大小,则会产生速度成本,因为系统需要找到一个具有足够空间的新内存位置,并在每次速度加倍时将每个项目逐一复制O(N)。平均而言,O(LogN)随着数组大小加倍,重新分配往往会变大。
如果您预留容量,如果您可以提前准确地预测阵列的大小,则可以将重新分配过程从零O(N)或O(NlogN) 平均降低到零。 这是文档。
您可以通过调用reserveCapacity(:)数组来做到这一点。
var myArray: [Double] = []
myArray.reserveCapacity(10000)
Run Code Online (Sandbox Code Playgroud)
由于阵列容量会根据需要快速扩展,因此在绝大多数情况下实际上没有必要。
对于 99.9% 尝试手动控制的用例来说,这不会提供任何明显的性能改进(如果有的话),并且不值得让其他开发人员感到困惑,因为他们不得不想知道为什么您如此关心这一点。
| 归档时间: |
|
| 查看次数: |
26412 次 |
| 最近记录: |