[英]Swift extension type constraints
Xcode 11.2.1
macOS 莫哈韦沙漠 10.14.6
因此,如果我保留了引用,我正在尝试添加从数组中删除对象的功能。 根据互联网建议,我使我的协议从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
, Element: AnyObject
出现如下编译错误:
...
public extension Array where Element: AnyObject {
...
...
// Compiler error: '[Foo]' requires that 'Foo' conform to 'AnyObject'
arrayCopy.removeElement(element: element)
...
Foo
确实符合AnyObject
。 它的定义就在那里。 为什么 XCode 不承认这一点?
您使用的是旧软件,因此不会收到现代错误消息:
在 'Array' 上引用实例方法 'removeElement(element:)' 要求 'Foo' 是一个类类型
这是真的。 element
不是静态类型的实例,就编译器的理解而言,但如果您像这样编写它,它将是这样的:
public func bar<Foo: Module.Foo>(array: [Foo], element: Foo) -> [Foo] {
当然, Module
是Module
的实际名称。
如果您需要使用异构数组,那么我不知道如何使事情变得更清晰。 如果你想得更好,请告诉我。
(保持函数的签名不变;改为更改主体。)
var arrayCopy: [AnyObject] = array
arrayCopy.removeElement(element: element)
return arrayCopy as! [Foo]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.