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中的错误?
答案 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)