2017-05-24 162 views
1

我正在製作節奏應用程序,但似乎無法隨機化這些圈子。這裏是我的代碼:Swift 2實例成員'circleIndexes'不能用於'GameScene'類型

var alternator = 0 
var fallTimer:NSTimer? 
var flag:Bool = true 

let circleIndexes = (0..<5).map { return NSNumber(integer: $0) } 

let randomIndexes = GKRandomSource.sharedRandom().arrayByShufflingObjectsInArray(circleIndexes) as! [Int] 

func fallCircleWrapper() { 

    if (flag == true) { 
     self.alternator += 1 
    } else { 
     self.alternator -= 1 
    } 

    if (self.alternator == 0) { 
     flag = true 
    } else if (self.alternator == 5) { 
     flag = false 
    } 

    self.hitAreaArray[randomIndexes[self.alternator]].emitNote(self.texture!) 

} 

問題是這一行:

let randomIndexes = GKRandomSource.sharedRandom().arrayByShufflingObjectsInArray(circleIndexes) as! [Int] 

這給出了錯誤「的實例成員‘circleIndexes’不能在類型‘GameScene’使用」。我應該如何解決這個問題?

+1

是*類的屬性* *在這種情況下,它將是[如何初始化相互依賴的屬性]的副本(https://stackoverflow.com/questions/25854300/how-to-initialize -properties - 即-依賴-上每個-其他)。 –

+1

爲什麼你使用Swift 2而不是3來創建新應用程序? – TheValyreanGroup

回答

1

下面這個例子再現上一個簡單的規模你的錯誤:

func agePlusOne(_ num: Int) -> Int { return num + 1 } 

class Cat { 

    var age = 5 
    var addedAge = agePlusOne(age) // ERROR! 
} 

你試圖使用一個屬性/前/已初始化...也就是說,之前的init()已完成,因此給你一個self

解決此問題的一種方法是使用lazy屬性...只有首次調用對象時,纔會初始化延遲屬性。也就是說,只有在存在可用的self之後,纔會正確初始化它們。

private(set) lazy var randomIndices: [Int] = { 
GKRandomSource.sharedRandom().arrayByShufflingObjectsInArray(self.circleIndexes) as! [Int] 
}() 

默認情況下,計算和靜態屬性也是懶惰的,無需使用關鍵字。不幸的是,你不能使用lazy let,所以private(set)被添加給你更多的不變性,但不是全部。

PS,這是Swift3,因此您可能需要將其轉換爲Swift2。

相關問題