【发布时间】:2020-05-27 13:19:55
【问题描述】:
XCode 11.2.1
macOS Mojave 10.14.6
所以,如果我保留了引用,我正在尝试添加从数组中删除对象的功能。根据 Internet 的建议,我使我的协议继承自 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 符合AnyObject。它就在它的定义中。为什么 XCode 不承认这一点?
【问题讨论】:
标签: ios swift xcode compiler-errors extension-methods