如何创build一个固定大小的对象数组

在Swift中,我试图创build一个64个SKSpriteNode的数组。 我想先将它初始化为空,然后我将Sprites放在前16个单元格中,最后16个单元格(模拟一个国际象棋游戏)。

从我在文档中理解的内容来看,我会期待如下的东西:

var sprites = SKSpriteNode()[64];

要么

var sprites4 : SKSpriteNode[64];

但它不起作用。 在第二种情况下,我得到一个错误:“定长数组还没有被支持”。 这可以是真实的吗? 对我来说,这听起来像一个基本的function。 我需要通过索引直接访问元素。

固定长度的数组还不被支持。 这实际上是什么意思? 不是说你不能创buildn很多东西的数组,显然你可以let a = [ 1, 2, 3 ]得到一个三个Int的数组。 这意味着数组大小不是可以声明为types信息的东西

如果你想要一个nil数组,你首先需要一个可选types的数组 – [SKSpriteNode?] ,而不是[SKSpriteNode] – 如果你声明了一个非可选types的variables,无论是一个数组还是一个单值,它不可能是nil 。 (还要注意[SKSpriteNode?][SKSpriteNode]?不同[SKSpriteNode]? …你需要一个可选的数组,而不是可选的数组。

Swift的devise非常明确,要求初始化variables,因为关于未初始化引用的内容的假设是C(和其他一些语言)中的程序可能变得越野的方式之一。 所以,你需要明确地要求一个包含64个nil[SKSpriteNode?]数组:

 var sprites = [SKSpriteNode?](count:64, repeatedValue: nil) 

这实际上返回一个[SKSpriteNode?]? ,但是:可选精灵的可选数组。 (有点奇怪,因为init(count:,repeatedValue:)应该不能返回nil)。要使用这个数组,你需要解开它。 有几种方法可以做到这一点,但在这种情况下,我喜欢可选的绑定语法:

 if var sprites = [SKSpriteNode?](count:64, repeatedValue: nil) { sprites[0] = pawnSprite } 

你现在可以做的最好的是创build一个初始计数重复nil的数组:

 var sprites = [SKSpriteNode?](count: 64, repeatedValue: nil) 

然后你可以填写任何你想要的值。


Swift 3.0中

 var sprites = [SKSpriteNode?](repeating: nil, count: 64) 

声明一个空的SKSpriteNode,所以不需要解包

 var sprites = [SKSpriteNode](count: 64, repeatedValue: SKSpriteNode()) 

就目前而言,语义上最接近的一个是具有固定数量元素的元组。

 typealias buffer = ( SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode, SKSpriteNode) 

但这是(1)使用非常不舒服,(2)内存布局不明确。 (至less我不知道)

你可以做的一件事就是创build一个字典。 考虑到你寻找64个元素,可能会有些sl but,但是它完成了工作。 我不知道是否它的“首选的方式”做到这一点,但它为我工作的结构数组。

 var tasks = [0:[forTasks](),1:[forTasks](),2:[forTasks](),3:[forTasks](),4:[forTasks](),5:[forTasks](),6:[forTasks]()]