Swift 3:如何在数组中找到对象的索引?

时间:2017-02-16 12:23:13

标签: swift swift3

我有一个协议:

protocol MyProtocol : NSObjectProtocol {
    func MyProtocolUpdated()    
}

我有一系列协议:

var delegates = Array<DataManagerDelegate>()

现在我想从协议数组中删除一个特定元素。 我猜我必须使用 delegates.remove(at: Int) 方法

为此,我尝试使用delegates.index(of: delegate)

找到对象的索引
But i'm getting the error "cannot invoke 'index' with an argument list of type '(of: MyProtocol)'"

如何从数组中删除特定对象?

由于

4 个答案:

答案 0 :(得分:0)

在Swift中从数组中删除对象的一种方法是使用函数式编程。

delegates.filter({ $0  !=  objectThatYouwantToRemove })

此代码将提供一个不具有删除对象的数组。

答案 1 :(得分:0)

您可以使用index(of: )函数获取元素的索引。它返回一个可选的Int,因此你必须打开它。您的DataManagerDelegate必须符合Equatable

if let index = delegates.index(of: delegate) {
    delegates.remove(at: index)
}

答案 2 :(得分:0)

为了从数组中查找对象,对象需要符合Equatable,因此数组可以将迭代中的当前项与您尝试查找的项进行比较。

为此,您声明协议添加:

extension DataManagerDelegate: Equatable { }

然后所有符合DataManagerDelegate的对象都需要实现

static func ==(lhs: Self, rhs: Self) -> Bool功能。

之后你应该能够找到一个对象的索引。

答案 3 :(得分:0)

如果要从数组中删除元素,可以使用Array.filter

protocol Shape {
  var name: String { get set }
}

struct Circle: Shape {
  var name = ""
}

struct Triangle: Shape {
  var name = ""
}
var shapes = Array<Shape>()

var circle1 = Circle(name: "circle1")
var triangle1 = Triangle(name: "triangle1")
var triangle2 = Triangle(name: "triangle2")

shapes.append(circle1)
shapes.append(triangle1)
shapes.append(triangle2)

// we want to remove the circle one so we filter it.
shapes = shapes.filter { $0.name != circle1.name }

print(shapes) 
// [Triangle(name: "triangle1"), Triangle(name: "triangle2")]