访问数组中对象的方法。 (迅速)

时间:2014-12-22 10:18:06

标签: arrays swift

这个问题似乎很容易,但我无法找到答案,我的搜索字词似乎是通用的,无法从网上获得答案 - 希望SO可以提供帮助:

我已在 swift 中创建了一系列SKSpriteNode个对象:

var images:[SKSpriteNode] = [];

我添加了一些节点:

images+=[SKSpriteNode(imageNamed: "StarrySky")];
images+=[SKSpriteNode(imageNamed: "StarrySky")];
images+=[SKSpriteNode(imageNamed: "StarrySky")];
images+=[SKSpriteNode(imageNamed: "StarrySky")];

现在,当我访问SKSpriteNode的方法时,我得到了不一致的结果:

images[0].position

例如:

func moveBackground(direction: CGVector) {
    //works
    let origin = images[0].position;
    var newPoint = CGPoint(x: origin.x + direction.dx, y: origin.y + direction.dy);
    positionBackground(newPoint);

    //next line has a compilation error.
    positionBackground(images[0].position + direction);
}

有时它会起作用,有时xCode会说Could not find member position。我认为数组没有成员position,而不是SKSpriteNode

我知道如何指定它是数组本身中对象的方法而不是数组吗?

1 个答案:

答案 0 :(得分:1)

错误消息"找不到会员位置"是误导和问题 与存储在数组中的精灵节点无关。

问题是您要添加CGPointCGVector

images[0].position + direction
    CGPoint--^  CGVector--^

并且Swift没有+运算符,它将(CGPoint, CGVector)作为参数。

您的其他代码

let origin = images[0].position
var newPoint = CGPoint(x: origin.x + direction.dx, y: origin.y + direction.dy)
positionBackground(newPoint)

有效,因为您可以按组件方式添加点和向量,即调用+ 具有CGFloat参数的运算符。

如果您希望将其缩短为

positionBackground(images[0].position + direction)

然后您必须定义自定义+运算符:

func +(lhs: CGPoint, rhs: CGVector) -> CGPoint {
    return CGPoint(x: lhs.x + rhs.dx, y: lhs.y + rhs.dy)
}