【问题标题】:NSCountedSet generic functionNSCountedSet 泛型函数
【发布时间】:2019-07-18 13:10:44
【问题描述】:

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

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”不符合预期的类型“可识别”

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

【问题讨论】:

  • 问题是$0 as? T.Type。您不能强制转换为元类型。
  • @matt:我抓住了你的 - 现在已删除 - 回答了关于 Type 的一个很好的解释。感谢您更详细地解释它。
  • 对不起,我删除了它,因为您的问题中没有足够的细节来使我的回答有意义。 (一切都取决于如何为 Person 定义 equatability 和 hashability,我无法理解为什么您返回 count(for:) 而不是 p.count。)但是,是的,如果您说 type:T.Type 并删除 @,您的代码将会编译987654335@ 来自as? 演员表。
  • @matt:是的,关于使用哪个count 很好。它实际上让我意识到我的代码中有一个小错误,因为我想要Person 的数量。现在let p = // 返回[Person],而NSCountedSet 中的计数为零。所以我需要在下一行使用self.count(for: p.first)。不过感觉有点麻烦。
  • 对,我注意到了同样的事情。这就是为什么我删除了我的答案。正如我所说,在不知道如何定义相等性和哈希性的情况下(显然,具有不同标识符的两个 Person 不相等,否则我们不会说话,但必须有一些东西使它们相等,否则您将不会使用计数集,那么做什么让他们平等?我不知道,因为你没有说),我无法给出明智的回应。 — 我更深层次的冲动是否认您确实需要首先使用计数集,但同样,不要提供任何细节,也不会得到任何帮助。

标签: swift generics nscountedset


【解决方案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 包含具有相同identifiers 的不同类型的Identifiable 元素,您可以使用解决它,

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)
}

【讨论】:

  • @matt 第二个参数是必需的,因为它将用于过滤元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多