Swift 2 实例成员“circleIndexes”不能用于“GameScene”类型
Posted
技术标签:
【中文标题】Swift 2 实例成员“circleIndexes”不能用于“GameScene”类型【英文标题】:Swift 2 Instance member 'circleIndexes' cannot be used on type 'GameScene' 【发布时间】:2017-05-24 20:04:49 【问题描述】:我正在制作一个节奏应用程序,但我似乎无法随机化圆圈。这是我的代码:
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'”。我应该如何解决这个问题?
【问题讨论】:
这是一个类的属性吗?在这种情况下,它会是How to initialize properties that depend on each other的副本。 你为什么在新应用中使用 Swift 2 而不是 3? 【参考方案1】:考虑这个以更简单的规模重现您的错误的示例:
func agePlusOne(_ num: Int) -> Int return num + 1
class Cat
var age = 5
var addedAge = agePlusOne(age) // ERROR!
您正在尝试使用属性 /before/ 它已被初始化...也就是说,在 init() 完成之前,从而为您提供了一个 self
来使用。
解决此问题的一种方法是使用lazy
属性...惰性属性仅在对象首次调用时才被初始化。也就是说,只有在self
可用时才正确初始化它们。
private(set) lazy var randomIndices: [Int] =
GKRandomSource.sharedRandom().arrayByShufflingObjectsInArray(self.circleIndexes) as! [Int]
()
computed 和 static 属性默认也是惰性的,不需要使用关键字。不幸的是,您不能使用lazy let
,因此添加了private(set)
以提供更多不变性,但不是全部。
PS,这是 Swift3,所以你可能需要将它转换为 Swift2。
【讨论】:
以上是关于Swift 2 实例成员“circleIndexes”不能用于“GameScene”类型的主要内容,如果未能解决你的问题,请参考以下文章
实例成员不能用于 struct swift 之间的嵌套类型的实例