如何创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]()]
- 如何在iOS 8中正确呈现popover
- 使用iPhone 6 / iOS 8读取NFC标签
- iOS 8 – 解除视图控制器与自定义演示文稿后的屏幕空白
- UIImagePickerController摄像头视图在iOS 8上奇怪的旋转(图片)
- iOS 8 Beta模拟器的文档目录path
- 我如何在Swift中声明typedef
- 为什么故事板的UI元素不显示UIViewController在Xcode 6?
- Xcode 6.0.1命令/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc失败,退出代码1
- 如何检测iOS 8中的UITextField的删除键?