我有一个要向其发送对象数组的函数。 我想做的是使用对象的值来过滤此对象数组,因为对象可能没有名称,年龄等共同的属性。
func searchVC<T>(_ searchCriteria: String, _ modelArray: [T]) {
let filteredArrayOfDict = modelArray.filter { $0.value == searchCriteria }
}
但是这给了我以下错误:
Value of type 'T' has no member 'value'
我的模型类如下:
class ABC : Mappable, CustomStringConvertible {
public private(set) var name : String?
public private(set) var age : Int?
public private(set) var abcArray : [ABCModelArray]
required init?(map: Map){
name = ""
age = -1
mapping(map: map)
}
func mapping(map: Map) {
name <- map["Name"]
age <- map["Age"]
}
public var description: String{
}
}
class EFG : Mappable, CustomStringConvertible {
public private(set) var type : String?
public private(set) var code : Int?
public private(set) var efgArray : [EFGModelArray]
required init?(map: Map){
type = ""
code = -1
mapping(map: map)
}
func mapping(map: Map) {
type <- map["Type"]
code <- map["Code"]
}
public var description: String{
}
}
如何实现?
答案 0 :(得分:2)
由于您自己曾经说过,这些对象可能没有公共属性,所以不能使用普通的泛型来实现。您需要将其限制为某些协议。例如:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
然后您的方法将如下所示:
protocol Filterable {
var filterableValue: String
}
您当然需要在此处传递的所有对象都遵守此协议,并为每个对象返回适当的func searchVC(_ searchCriteria: String, _ modelArray: [Filterable]) {
let filteredArrayOfDict = modelArray.filter { $0.filterableValue == searchCriteria }
}
。
答案 1 :(得分:1)
是的,但是您需要使您的类型符合HasValue
protocol HasValue {
var value: String { get }
}
示例
struct Person: HasValue {
let firstName: String
let age: Int
var value: String { return firstName }
}
现在您可以定义函数了
func filter<Element:HasValue>(list: [Element], byKeyword keyword: String) -> [Element] {
return list.filter { $0.value == keyword }
}