繁体   English   中英

Swift 扩展类型约束

[英]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: AnyObjectElement: 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] {

当然, ModuleModule的实际名称。


如果您需要使用异构数组,那么我不知道如何使事情变得更清晰。 如果你想得更好,请告诉我。

(保持函数的签名不变;改为更改主体。)

var arrayCopy: [AnyObject] = array
arrayCopy.removeElement(element: element)
return arrayCopy as! [Foo]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM