我正在制作一个节奏应用程序,但我似乎不能随机化圆圈。下面是我的代码:
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'”。我该怎么解决这个问题呢?
发布于 2017-05-25 08:02:31
考虑这个例子,它在一个更简单的尺度上再现了你的错误:
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。
https://stackoverflow.com/questions/44167536
复制相似问题