2015-04-12 48 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 ... –