输入' T'不符合协议' AnyObject'

时间:2015-06-24 22:25:49

标签: ios swift compiler-errors

我正在Swift中创建一个IOS应用程序,它具有从屏幕右侧移动到屏幕左侧的块。在它不在视野后我想删除它。这是Block Class:

class Block : BasicObject {

    var type : Int
    var velocity = CGVectorMake(-playerVelocityY, -playerVelocityY)

    init(x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat, type: Int) {
        self.type = type
        super.init(x : x, y : y, width : width, height : height)
    }

    func update() {

        self.position.x += self.velocity.dx

        if self.position.x + self.size.width < 0 {
            blocks.removeObject(self) // <-- line of code to delete object from list
        }

    }

}

它继承自BasicObject类:

class BasicObject {
    var position : CGPoint
    var size : CGSize
    init (x : CGFloat, y : CGFloat, width : CGFloat, height : CGFloat){
        self.position = CGPointMake(x, y)
        self.size = CGSizeMake(width, height)
    }
} 

现在在我的Block Class中有代码行:

blocks.removeObject(self)

这行代码指的是:

var blocks : [Block] = []

extension Array {
    func removeObject<T>(object: T) {
        for items in self {
            if self[items] === object { // <-- Error occurs on this line
                self.removeAtIndex(items)
            }
        }
    }
}

出于某种原因,错误:输入&#39; T&#39;不符合协议&#39; AnyObject&#39;。有人可以解释为什么会这样,并提供一个如何解决它的例子。或者,如果有人甚至可以提供一种更简单的方法来从块数组中删除块对象。

2 个答案:

答案 0 :(得分:3)

这里有一些事情。首先,数组是struct,因此如果不使用 mutating 方法,则无法修改方法中的内容。另一件事是你如何比较一个 T 对象,除非它们符合可比较协议。

我在你的示例方法removeObject中修改了一些东西,

extension Array where T:Comparable{
    mutating func removeObject(object: T) {
        for (index, item) in self.enumerate() {
            if item == object {
                self.removeAtIndex(index)
                break
            }
        }
    }
}

顺便说一下,你可以用Swift * indexOf **和 removeAtIndex 方法做同样的事情。

extension Array where T:Comparable{
    mutating func removeObject(object: T) {
        while  let index =  indexOf(object) {
            removeAtIndex(index)
        }
    }
}

答案 1 :(得分:0)

数组是值类型,因此要修改需要将函数声明为变异。 同时将通用接口声明为 Equatable 以进行比较,并检查相同类型的运算符。

(
    SELECT id, value FROM table2
    UNION ALL
    SELECT id, value FROM table1
) GROUP BY id