【发布时间】: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