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)
}
为了查看 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)
}