2

我目前正在编写一个创建 iOS 等距游戏的教程。你可以在这里找到这个

我刚开始编写 Swift 代码,因为在使用超过 3 个月的教程时出现了很多语法错误,我问自己最近 Swift 是否有一些主要更新。

到目前为止,我自己或 XCode 本身设法解决了这些小问题,但我无法帮助自己解决这个问题:

protocol TextureObject {
    class var sharedInstance: TextureDroid {get}
    var texturesIso:[[SKTexture]?] {get}
    var textures2D:[[SKTexture]?] {get}
}

这是我要设置的协议(与教程中的完全一样),但 XCode 不允许我定义类变量。错误代码如下:

"Class properties are only allowed within classes: 
use static to declare a static property"

将“类”替换为“静态”(这对我来说没有逻辑意义)和删除协议(并定义应该在不使用协议的情况下继承的类)都会导致此代码中的另一个错误:

class TextureDroid: TextureObject  {

class var sharedInstance: TextureDroid {
    return textureDroid
}

let texturesIso:[[SKTexture]?]
let textures2D:[[SKTexture]?]

init() {

    texturesIso = [[SKTexture]?](count: 2, repeatedValue: nil)
    textures2D = [[SKTexture]?](count: 2, repeatedValue: nil)

    //Idle
    texturesIso[Action.Idle.rawValue] = [
        SKTexture(imageNamed: "iso_3d_"+textureImage(Tile.Droid, Direction.N, Action.Idle)),
        SKTexture(imageNamed: "iso_3d_"+textureImage(Tile.Droid, Direction.NE, Action.Idle)),
        SKTexture(imageNamed: "iso_3d_"+textureImage(Tile.Droid, Direction.E, Action.Idle)),
        SKTexture(imageNamed: "iso_3d_"+textureImage(Tile.Droid, Direction.SE, Action.Idle)),
        SKTexture(imageNamed: "iso_3d_"+textureImage(Tile.Droid, Direction.S, Action.Idle)),
        SKTexture(imageNamed: "iso_3d_"+textureImage(Tile.Droid, Direction.SW, Action.Idle)),
        SKTexture(imageNamed: "iso_3d_"+textureImage(Tile.Droid, Direction.W, Action.Idle)),
        SKTexture(imageNamed: "iso_3d_"+textureImage(Tile.Droid, Direction.NW, Action.Idle)),
    ]

此错误出现在我要填充 texturesIso 的所有行中

Immutable value 'self.texturesIso' may not be assigned to

以下是我的问题:

  1. 如何修复第一个错误?是否有一种新方法可以在协议中定义类?

  2. 这两个错误是相关联的,还是第二个刚刚出现,因为我设法消除了第一个?

  3. 如何以正确的方式填充 SKTexture?texturesIso.append 也不起作用。

  4. 我对 Swift 更新是否正确?如果是,是否有对 Swift 的所有突然变化的概述,因为我找不到。

我真的很感谢任何人的帮助,非常感谢提前。

4

1 回答 1

0

本教程似乎使用了旧版本的 swift。您可以使用使用早期 swift 编译器的较旧版本的 xcode,也可以更新代码。我将尝试帮助您更新代码。

  1. “协议声明不能包含类、结构、枚举或其他协议声明。协议成员声明将在下面详细讨论。” - 关于 swift 协议声明的 Apple 文档

只需将类 var 更改为静态。这不会导致第二个错误,只是编译器在第一个错误之后停止,因此不会显示第二个错误。

  1. 不能将不可变值“self.texturesIso”分配给

    var texturesIso:[[SKTexture]?] {get}

定义了一个 getter 但没有 setter,因此您无法设置 self.texturesIso 属性。将其更改为 {get set},并且可能也需要对 textures2d 属性执行相同操作,并将它们更改为类中的 vars。

  1. 有一个快速更新是的。新版本是 Swift 1.2

除了回答这个特定问题之外,当我下载教程代码时,为了让它编译,我还需要将 touchesEnded 更改为使用 Set 而不是 NSSet,这会破坏 touches.anyObject,所以我使用 touches.first 代替。此外,它试图更改 gameScene 中的不可变图块,因此我将其更改为 var。

注意:我刚刚下载了代码并让它编译和运行,我不确定它应该如何运行,但对我来说似乎没问题。swift还有类级别的静态变量吗?有一些关于计算类变量与静态变量的好信息,尽管它没有谈论问题的协议位

于 2015-05-13T12:36:28.017 回答