XCode 11.2.1 macOS Mojave 10.14.6
Итак, я пытаюсь добавить возможность удалять объекты из массива, если я сохранил ссылку. Следуя совету inte rnet, я заставил мой протокол наследоваться от AnyObject
, так как это вызывает / требует / подразумевает, что ===
будет определено во всех классах, которые реализуют протокол. Однако XCode ведет себя странно с типами в расширении Array. Считайте, что следующие компиляции нормально:
public protocol Foo: AnyObject {
}
public extension Array where Element == Foo {
mutating func removeElement(element: Element) {
if let idx = self.firstIndex(where: {$0 === element}) {
self.remove(at: idx)
}
}
}
public func bar(array: [Foo], element: Foo) -> [Foo] {
var arrayCopy: [Foo] = array
arrayCopy.removeElement(element: element)
return arrayCopy
}
, но если я изменю тип расширения на Element: AnyObject
, я получу ошибку компиляции следующим образом:
...
public extension Array where Element: AnyObject {
...
...
// Compiler error: '[Foo]' requires that 'Foo' conform to 'AnyObject'
arrayCopy.removeElement(element: element)
...
Foo
DOES соответствовать AnyObject
. Это прямо в своем определении. Почему XCode не подтверждает это?