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”类型的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 - 实例化视图控制器后没有成员错误

在 Swift 3 中将类与同名的实例成员区分开来

实例成员不能用于 struct swift 之间的嵌套类型的实例

Swift:实例成员不能用于 ARKitVision 示例中的类型

Swift 不能在属性初始化器中使用实例成员

Swift Playground - 实例成员不能用于类型自定义类