【问题标题】:Swift extension type constraintsSwift 扩展类型约束
【发布时间】: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


    【解决方案1】:

    您使用的是旧软件,因此您不会收到现代错误消息:

    在 'Array' 上引用实例方法 'removeElement(element:)' 要求 'Foo' 是一个类类型

    这是真的。 element 不是静态类型的实例,就编译器的理解而言,但如果你这样写它就会是:

    public func bar<Foo: Module.Foo>(array: [Foo], element: Foo) -> [Foo] {
    

    当然,Module 是模块的实际名称。


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

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

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

    【讨论】:

    • 嗯。这个 kindof 有效,但实际上您将 Foo 替换为 T: Foo。这很好——除非在调用时(如bar([Foo](),FooClass() as Foo)),Swift 告诉我“协议类型 'Foo' 不能符合 'Foo',因为只有具体类型才能符合协议”。这个问题只是被推到了别处。除非只是我的软件太旧?新的bar 会接受带有更新软件的Foo 数组吗?
    • 我为异构集合添加了一个“解决方案”,如果这是您需要使用的。 ?‍♂️
    • 遗憾的是,新解决方案无法编译,removeElement 行给出编译器错误“'AnyObject' 不能用作符合协议 'Foo' 的类型,因为 'Foo' 具有静态要求”。它是否在您的 XCode 中编译?也许这又是版本差异?
    • “在我的机器上工作”!我无法显示该错误。确保您没有意外使用上述两个部分。
    • 嗯。好吧,假设它按书面方式工作,我会接受你的回答,如果我更新 XCode,也许会回到这个,哈哈。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多