此代码是否显示Swift中的错误或我做错了什么

时间:2015-03-11 16:18:15

标签: swift

Protocol EnemyView {
    var face: SKTexture! {get set}
}

class VectorEnemyImageMaker {

    func createImage(enemySprite: EnemyView, face: Int) {

        // ...
        enemySprite.face = SKTexture(image: image)
        // ...
    }
}

给我一​​个“无法在enemySprite中分配给'face'

这是奇怪的事情。如果我将课程更改为:

class VectorEnemyImageMaker {

    func createImage(enemySprite: EnemySprite, face: Int) {

        // ...
        var e = enemySprite as EnemyView
        e.face = SKTexture(image: image)
        // ...
    }
}

这有效!

有没有人有解决方案,或者这是Swift中的错误?

1 个答案:

答案 0 :(得分:1)

func createImage(enemySprite: EnemyView, face: Int) {
    var e = enemySprite as EnemyView
    e.face = SKTexture(image: image)

以上编译,但这不是:

func createImage(enemySprite: EnemyView, face: Int) {
    enemySprite.face = SKTexture(image: image)

...因为Swift不知道EnemyView采用者,enemySprite的类型,是一个类。它可能是一个结构(或枚举)。并且您不能在适当的位置改变结构实例(或枚举实例); struct(或enum)是值类型,而不是引用类型。因此,您必须对实例进行var引用才能改变它的属性。

你可以简单地保证Swift只有一个类会采用EnemyView,当你声明它时,就像这样:

Protocol EnemyView : class { // only classes can adopt me
    var face: SKTexture! {get set}
}

另一种方法是使参数本身成为var引用,以便它可以被变异:

func createImage(var enemySprite: EnemyView, face: Int) { // note "var"
    enemySprite.face = SKTexture(image: image)