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

Swift泛型从数组中删除类实例,swift,swift3,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 }) { remo

我想实现以下目标:;能够从数组中删除任何给定实例。但是,以下不是有效的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)

通用方法如何工作?我不想将MyProtocol或Equatable的通用扩展设为特殊情况。

用以下内容替换扩展:

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

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

extension Array where Element: AnyObject {
    mutating func remove2(_ object: AnyObject) {
        if let index = index(where: { $0 === object }) {
            remove(at: index)
        }
    }
}
根据文档,
AnyObject

所有类隐式符合的协议

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

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


因此,您需要
var myArray:[AnyObject]
。这很好地解释了为什么Swift中当前存在此限制。

这将向所有
Array
实例添加
remove
方法,我认为询问者希望将此方法仅限于包含类的数组。感谢您的回复。因此,从您的回答中我了解到,对于类型化对象和集合,目前无法实现这一点。编译器确实允许我以这种方式编写数组,但是除非声明为[AnyObject],否则它无法看到remove方法。是。奇怪的是,允许您声明
AnyObject
的数组,但不允许声明从
AnyObject
派生的协议数组。也许这是因为编译器优先处理
任何对象