我有一个协议:
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)'"
如何从数组中删除特定对象?
由于
答案 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")]