ios - Swift 扩展类型约束

标签 ios swift xcode compiler-errors extension-methods

XCode 11.2.1
macOS 莫哈维 10.14.6

因此,如果我保留了引用,我正在尝试添加从数组中删除对象的功能。根据互联网建议,我使我的协议(protocol)继承自 AnyObject,因为这会导致/需要/暗示 === 在实现该协议(protocol)的任何类上定义。然而,XCode 对于数组扩展上的类型表现得很奇怪。考虑以下编译良好:

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 不承认这一点?

最佳答案

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

Referencing instance method 'removeElement(element:)' on 'Array' requires that 'Foo' be a class type

确实如此。根据编译器的理解,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]

关于ios - Swift 扩展类型约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60180625/

相关文章:

ios - 如何检测我是否在 iOS 中使用未记录的 api

ios - 在1个非 TableView Controller 中显示多个核心数据实体对象

iOS : Show the Callout view on moving pin

ios - Xcode如何组合UI按钮?

ios - "Invalid Token"尝试使用 firebase 验证电话号码时

ios - 为 `UICollectionViewController` 带来一个 UIView 到前面

iOS swift popToRootViewController 在 rootViewController 中触发函数

xcode - 目标的build设置中没有 "Metal Compiler"

c++ - 如何在 Xcode 中包含 .a 库?

ios - AVPlayerLayer 与 AVPlayerViewController