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

时间:2016-09-19 17:29:35

标签: 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)

通用方法如何运作?我不想特别说明MyProtocol或Equatable的通用扩展。

2 个答案:

答案 0 :(得分:3)

将限制转换为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]Here可以很好地解释为什么Swift中存在这种限制。

答案 1 :(得分:2)

用此替换扩展名:

 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)
        }
    }
 }