首页 > 解决方案 > 将超类数组扩展应用于子类实例数组

问题描述

有没有办法使用已应用于子类实例数组的超类的数组扩展?我试图通过以下方式这样做:

超类的扩展:

extension Array where Element == Superclass {

    func appending(_ object:Element)-> [Element] {
        var array = self
        if self.filter({$0.id == object.id}).count == 0 {
            array.append(object)
        }
        
        return array
    }
}

子类数组的实现:

var subArray = [Subclass]()
subArray = subArray.appending(someObject)

但是,这给了我以下编译器错误:

“在 'Array' 上引用实例方法 'appending' 要求类型 'Subclass' 和 'Superclass' 是等价的。”

有什么方法可以实现这个功能,还是我必须为每个子类创建单独的扩展?

标签: arraysswiftclass-extensions

解决方案


使用:而不是==表示“一个子类型”:

class Superclass {
    
}

class Subclass : Superclass {
    
}

// here!
extension Array where Element: Superclass {
    func f() {}
}

let a = [Subclass]()
a.f() // compiles!

推荐阅读