2015-04-12 84 views
4

我能够使用方法1初始化CALayer,该方法在代码的其余部分正确工作,但不是方法2。请问您能否告知哪些问题。如何初始化对象的Swift数组,例如: CALayer

初始化的CALayer

var layers:[CALayer]! 

方法1.工作

layers = [CALayer(), CALayer(), CALayer(), CALayer(), CALayer(), CALayer(), CALayer(), CALayer()] 

方法2不工作

layers = [CALayer](count: 8, repeatedValue: CALayer()) 

回答

2

方法2不起作用,因为初始安装的确切在数组的每个索引中都有相同的值。

您可以使用方法,或者你可以使用一个for循环:

var layers = [CALayer]() 
layers.reserveCapacity(layerCount) 

let layerCount = 10 
for (_ in 1... layerCount) 
{ 
    layers.append(CALayer()) 
} 

(我还是习惯斯威夫特,这样的语法可能并不完美,但它应该给你的总体思路)

+0

@AirspeedVelocity,它看起来像没有minimumCapacity初始值设定为数组像字典?看起来像一个遗漏。我敢打赌,创建一个数组,然后扩展它的容量做2次分配,'Dictionary(minimumCapacity)'形式只做一次分配。 –

6

您可以使用map和区间:

layers = (0..<8).map { _ in CALayer() } 

_ in是一个烦恼,不应该是必要的,但斯威夫特的类型推断铜rrently需要它。

map方法有超过for为基础的方法的一大优势,因为这意味着你可以用let声明layers如果不打算就需要以后进一步发生变化:

let layers = (0..<8).map { _ in CALayer() } 

它也可能相对于多个appends,效率稍高一些,因为阵列的大小可以提前计算map,而append需要随着其增长调整阵列大小。

+0

我比你更喜欢你的方法。 (我编辑了我的代码以保留要创建的图层数量的容量,但是map语句在一行中完成了相同的操作。顺便提一下,我必须知道,拉登还是空载? –

+1

非洲或欧洲? –

+0

什么?不知道!Aieeeee ... –