Swift 如何一次存储多个属性?

Swift 如何一次存储多个属性?,swift,sprite-kit,initialization,Swift,Sprite Kit,Initialization,我正在与Swift、Xcode 6和SpriteKit合作 我想制作一个游戏,其中一些精灵从屏幕顶部掉落,但每个精灵都有一个定义的速度、位置和激活时间。我有这个工作代码,但我真的不认为这是最优化的方法: class obstacles: SKSpriteNode { var isOnScreen = false var type: Int = 0 var initTime: Int = 0 } var obstacle = [obstacles]() // obstac

我正在与Swift、Xcode 6和SpriteKit合作

我想制作一个游戏,其中一些精灵从屏幕顶部掉落,但每个精灵都有一个定义的速度、位置和激活时间。我有这个工作代码,但我真的不认为这是最优化的方法:

class obstacles: SKSpriteNode
{
    var isOnScreen = false
    var type: Int = 0
    var initTime: Int = 0
}

var obstacle = [obstacles]() // obstacle is an array of SKSpriteNode

// type : initTime : speed : position : xScale : yScale
var level1: [String] = ["0:120:3:0:1:1", "0:130:4:80:2:2","1:140:8:120:6:1","0:150:6:240:2:2"]

override func didMoveToView(view: SKView)
{        
    initObstacles()
}

func initObstacles()
{
    for var x = 0; x < level1.count; x++ // for each obstacle
    {
        var index = 0

        var type = String("")
        var initTime = String("")
        var speed = String("")
        var position = String("")
        var xScale = String("")
        var yScale = String("")

        var lastIndex = obstacle.count

        for Character in level1[x] // we read each character one by one
        {
            if Character == ":" { index++ } // if it's a ":" we change the variable
            else
            {
                switch index
                {
                case 0:
                    type += String(Character)
                case 1:
                    initTime += String(Character)
                case 2:
                    speed += String(Character)
                case 3:
                    position += String(Character)
                case 4:
                    xScale += String(Character)
                case 5:
                    yScale += String(Character)
                default:
                    break;
                }
            }
        }

        obstacle.append(obstacles(imageNamed: "Rectangle")) // we add an element to the array

        obstacle[lastIndex].type = type.toInt()! // we init all the values
        obstacle[lastIndex].initTime = initTime.toInt()!
        obstacle[lastIndex].speed = CGFloat(speed.toInt()!)
        obstacle[lastIndex].size.width = DEFAULT_OBSTACLE_SIZE * CGFloat(xScale.toInt()!)
        obstacle[lastIndex].size.height = DEFAULT_OBSTACLE_SIZE * CGFloat(yScale.toInt()!)
        obstacle[lastIndex].position = CGPointMake(CGFloat(position.toInt()!) - obstacle[lastIndex].size.width/2, CGRectGetMaxY(frame) + obstacle[lastIndex].size.height/2)
    }
}
类障碍:SKSpriteNode
{
var isOnScreen=false
变量类型:Int=0
var initTime:Int=0
}
var障碍=[障碍]()//障碍是一个SKSpriteNode数组
//类型:initTime:speed:position:xScale:yScale
变量level1:[字符串]=[“0:120:3:0:1:1”,“0:130:4:80:2:2”,“1:140:8:120:6:1”,“0:150:6:240:2:2”]
覆盖func didMoveToView(视图:SKView)
{        
初始障碍()
}
func init()
{
对于var x=0;x

你知道我如何做同样的事情,但更“干净”

我建议创建一个
类或
结构,保存障碍物的所有必要数据,并将你的类型从标准数字更改为
枚举
,例如:

enum ObstacleType {
    case Block, Tree, WhatEverObstaclesYouHave...
}
struct Obstacle {
    var type: ObstacleType
    var initializationTime: NSTimeInterval
    var speed: Double
    // and similarly for position, your scales and what you may need in future
}
并使用创建它们,例如

Obstacle(type: .Block, initializationTime: 0, speed: 12.0, ...)
优点(显然)是解析字符串不再有问题(不再有字符串),并且可以直接使用适当的类型提供所有必要的信息。您可以很容易地为您的类型使用枚举,它应该是枚举,因为您的障碍不是
1
,而是块、树或任何东西

您的
level1
变量可以这样定义:

var level1 : [Obstacle] = [
    Obstacle(type: .Block, initializationTime: 120, speed: 3.0, ...),
    Obstacle(type: .Block, initializationTime: 130, speed: 4.0, ...),
    Obstacle(type: .Tree,  initializationTime: 140, speed: 8.0, ...),
    Obstacle(type: .Block, initializationTime: 150, speed: 6.0, ...)
]
Obstacle(.Block, 120, 3.0, ...)

要去掉初始值设定项中的标签,只需定义自己的初始值设定项。只需将其添加到结构中:

init(_ type: ObstacleType, _ time: NSTimeInterval, _ speed: Double, ...) {
    self.type = type
    self.initializationTime = time
    self.speed = speed
    // other variables...
}
然后,您可以像这样创建每个障碍:

var level1 : [Obstacle] = [
    Obstacle(type: .Block, initializationTime: 120, speed: 3.0, ...),
    Obstacle(type: .Block, initializationTime: 130, speed: 4.0, ...),
    Obstacle(type: .Tree,  initializationTime: 140, speed: 8.0, ...),
    Obstacle(type: .Block, initializationTime: 150, speed: 6.0, ...)
]
Obstacle(.Block, 120, 3.0, ...)

但是现在,通过读取实例化,您无法再轻松地分辨哪个数字具有什么意义。我不建议只键入较少的内容,因为autocomplete将向您展示大部分内容。

好的,谢谢,但我需要定义级别,每个级别都是相同的,因此我必须在开始时用每个对应的值初始化该级别的每个障碍,我不知道如何操作,因为我可以轻松地在一个关卡中设置100个障碍…@Drakalex所以,你只是有太多障碍,不想手动设置所有值?不,我必须手动设置所有值,但这不是问题,我不知道设置所有值的最佳方式是什么?我想要类似于
var level1:[String]=[“0:120:3:0:1:1”,“0:130:4:80:2:2”,“1:140:8:120:6:1”,“0:150:6:240:2:2”]
这代表了前4个障碍和它们的parameters@Drakalex我为您的
level1
添加了一个示例。我将类型0转换为块,将类型1转换为树。根据需要调整。好的,谢谢。这正是我想要的,但是有没有办法避免键入类型:,初始化时间,速度等等?像
障碍物(.Block,150,6.0,…)