Swift 泛型从数组中删除类实例

Bou*_*uke 4 swift swift3

我想实现以下目标;能够从数组中删除任何给定的实例。但是以下不是有效的 Swift 3 语法:

extension Array where Element: class { // error: Expected identifier for type name
    mutating func remove(_ object: AnyObject) {
        if let index = index(where: { $0 === object }) {
            remove(at: index)
        }
    }
}

protocol MyProtocol: class { }
class MyClass: MyProtocol { }
var myInstance = MyClass()
var myArray: [MyProtocol] = [myInstance]
myArray.remove(myInstance)
Run Code Online (Sandbox Code Playgroud)

通用方法如何发挥作用?我不想对 MyProtocol 或 Equatable 的通用扩展进行特殊处理。

Cri*_*tik 5

将您的限制转换为AnyObject而不是class

extension Array where Element: AnyObject {
    mutating func remove(_ object: Element) {
        if let index = firstIndex(where: { $0 === object }) {
            remove(at: index)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

以下注释不再正确,保留它们用于历史目的。

现在唯一的问题是编译器不允许您声明var myArray: [MyProtocol],因为它会抛出以下内容:

错误:不支持使用“MyProtocol”作为符合协议“AnyObject”的具体类型

所以你需要var myArray: [AnyObject]这里很好地解释了为什么 Swift 中目前存在此限制。