2017-05-24 161 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。

相关问题