0

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

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

       return self.count(for: p)
    }
}

效果很好,但它非常适用于Person.

所以我试图让它通用:

public func countFor<T: Identifiable >(type: T, identifier: String) -> Int {
    let p = self.compactMap { $0 as? T.Type }.filter { $0. 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
    }
}

这给了我这个错误:

实例成员“标识符”不能用于类型“T”

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

参数类型“Person.Type”不符合预期类型“可识别”

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

4

1 回答 1

1

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

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

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

public func countFor<T: Identifiable>(type: T, identifier: String) -> Int {
    let p = self.compactMap { $0 as? T }.filter { $0.identifier == identifier }
    return self.count(for: p)
}
于 2019-07-18T13:17:35.937 回答