针对Swift 4.2的更新:
假设委托实际上是一个类的实例,您可以通过从“class”继承来要求在协议中实现:
protocol LocationManagerDelegate: class {
// ...
}
接着使用 firstIndex(where:)
方法,并使用 "恒等运算符" ===
:
class LocationManager: NSObject {
private var _delegates = [LocationManagerDelegate]()
func removeDelegate(delegate:LocationManagerDelegate) {
if let index = _delegates.firstIndex(where: { $0 === delegate }) {
_delegates.remove(at: index)
}
}
}
旧版答案(Swift 1):
有两个略有不同的contains()
函数:
func contains<S : SequenceType where S.Generator.Element : Equatable>(seq: S, x: S.Generator.Element) -> Bool
func contains<S : SequenceType, L : BooleanType>(seq: S, predicate: (S.Generator.Element) -> L) -> Bool
您正在使用第一个选项,它要求序列元素符合Equatable
协议,即它们可以通过==
进行比较。
假设委托实际上是一个类的实例,您可以通过“继承”自“class”来在协议中要求:
protocol LocationManagerDelegate : class {
}
然后使用第二个基于谓词的版本的contains()
,并使用身份运算符===
:
func removeDelegate(delegate:LocationManagerDelegate) {
if contains(_delegates, { $0 === delegate }) {
}
}
要从数组中删除对象,您需要获取其索引,因此可以使用https://dev59.com/W4Lba4cB1Zd3GeqPkuNm#25543084中的findIdenticalObject()
函数:
func findIdenticalObject<T : AnyObject>(array: [T], value: T) -> Int? {
for (index, elem) in enumerate(array) {
if elem === value {
return index
}
}
return nil
}
然后从数组中查找并删除
func removeDelegate(delegate:LocationManagerDelegate) {
if let index = findIdenticalObject(_delegates, delegate) {
_delegates.removeAtIndex(index)
}
}
[NSObject -isEqual:]
那样)? - Aaron Brager