Я хочу узнать, является ли точный экземпляр объекта в массиве. Это казалось очень полезной функцией, чтобы иметь, так что я пытался сделать расширение массива:Swift2: расширение для массива, которое сравнивает точные объекты?
extension Array {
func containsIdenticalObject(object: AnyObject)->Bool {
if self.count > 0 {
for (_, objectToCompare) in self.enumerate() {
if object === objectToCompare {
return true
}
}
}
return false
}
}
Я получаю сообщение:
error: binary operator '===' cannot be applied to operands of type 'AnyObject' and 'Element'.
Я пытался перетасовываю его вокруг с различными родовыми изменениями, такие как <T: This>
и where Self: That
, но я всегда получаю то же сообщение.
Кажется, что это определенно возможно. Как мне изменить эту функцию, чтобы она работала?
Редактировать
Я был в состоянии сделать эту работу в качестве автономной функции:
func arrayContainsExactInstance<T>(array:[T], _ object:T)->Bool {
if array.count > 0 {
for (_, givenObject) in array.enumerate() {
let givenObjectAsAnyObject = givenObject as! AnyObject
let targetObjectAsAnyObject = object as! AnyObject
if ObjectIdentifier(givenObjectAsAnyObject) == ObjectIdentifier(targetObjectAsAnyObject) {
return true
}
}
}
return false
}
... который является большим, за исключением а) кажется чрезмерно сложным, и б) должен быть какой-то способ, чтобы добавить его к фактическому расширению ...
ты испытал это в Playground? Это не бросаться сама ошибка, но когда я пытаюсь использовать ее с массивом пользовательского класса 'MyClass', например, я получаю сообщение:' error: using 'MyClass' как конкретный тип, соответствующий протоколу 'AnyObject' не поддерживается' –
@LeMotJuiced: не удается воспроизвести, он работает как в скомпилированном проекте, так и на игровой площадке для меня. Я добавил свой тестовый код для ответа для вашего удобства. - Какую версию Xcode вы используете? –
Попробуйте это на игровой площадке с вашим расширение как написано: 'protocol MyProtocol: class, AnyObject {} // newline class MyClass: MyProtocol {} // newline let classInstance = MyClass() // newline let classArray: [MyProtocol] = [] // newline classArray.containsIdenticalObject (classInstance) // newline '(извините промежуток, я не знаю, как правильно это сделать в Markdown в комментариях). –