gpt4 book ai didi

ios - 在快速的委托(delegate)数组中查找委托(delegate)

转载 作者:搜寻专家 更新时间:2023-10-30 22:25:25 25 4
gpt4 key购买 nike

我想在删除之前检查我的 removeDelegate 方法中是否已经有一个委托(delegate)。我怎么做?

这是我到目前为止所得到的:

protocol LocationManagerDelegate {
func locationManagerDidUpdateLocation(
oldLocation: CLLocationCoordinate2D,
currentLocation: CLLocationCoordinate2D
)
}

class LocationManager: NSObject {
private var _delegates = [LocationManagerDelegate]()

func removeDelegate(delegate:LocationManagerDelegate) {
if contains(_delegates, delegate) {
// Remove delegate
}
}
}

但是,这会在“if contains”行中出现以下错误:

不能使用类型为“(@lvalue Array< LocationManagerDelegate >!, LocationManagerDelegate)”的参数列表调用“包含”

最佳答案

Swift 4.2 更新:

假设委托(delegate)实际上是的实例,您可以通过从“类”“继承”来在协议(protocol)中要求:

protocol LocationManagerDelegate: class {
// ...
}

然后使用firstIndex(where:)方法,使用“identity operator===:

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 协议(protocol),即它们可以与 == 进行比较。

假设委托(delegate)实际上是的实例,您可能需要在协议(protocol)中通过“继承”自“类”:

protocol LocationManagerDelegate : class {
// ...
}

然后使用 contains() 的第二个基于谓词的版本身份运算符===:

func removeDelegate(delegate:LocationManagerDelegate) {
if contains(_delegates, { $0 === delegate }) {
// Remove delegate
}
}

要从数组中删除对象,您必须获取其索引,因此您可以使用来自 https://stackoverflow.com/a/25543084/1187415findIdenticalObject() 函数:

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

关于ios - 在快速的委托(delegate)数组中查找委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27532897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com