NSCountedSet 泛型函数

NSCountedSet generic function

为了查看 NSCountedSet 中有多少个具有特定标识符的 Person 对象,我创建了以下函数:

public extension NSCountedSet {
    public func countFor(identifier: String) -> Int {
       let p = self.compactMap { [=10=] as? Person }.filter { [=10=]. identifier == identifier }

       return self.count(for: p)
    }
}

效果很好,但它非常适合 Person

所以我试图让它变得通用:

public func countFor<T: Identifiable >(type: T, identifier: String) -> Int {
    let p = self.compactMap { [=11=] as? T.Type }.filter { [=11=]. identifier == identifier }

    return self.count(for: p)
}

Person 符合 Identifiable 协议:

public protocol Identifiable {
    var identifier: String { get }
}

和:

extension Person: Identifiable {
    public var identifier: String {
        return name
    }
}

这给了我这个错误:

Instance member 'identifier' cannot be used on type 'T'

当我调用这个函数时,出现以下错误:

Argument type 'Person.Type' does not conform to expected type 'Identifiable'

我错过了什么,有没有办法让它工作?

我认为您甚至不需要 Generics。你可以简单地这样做,

public func countFor(identifier: String) -> Int {
    let p = self.compactMap { [=10=] as? Identifiable }.filter { [=10=].identifier == identifier }
    return self.count(for: p)
}

如果 set 包含具有相同 identifiers 的不同类型的 Identifiable 元素,您可以使用

解决它
public func countFor<T: Identifiable>(type: T, identifier: String) -> Int {
    let p = self.compactMap { [=11=] as? T }.filter { [=11=].identifier == identifier }
    return self.count(for: p)
}