如何在iOS中过滤通用类型的数组

时间:2018-08-16 10:29:09

标签: ios swift nsarray objectmapper

我有一个要向其发送对象数组的函数。 我想做的是使用对象的值来过滤此对象数组,因为对象可能没有名称,年龄等共同的属性。

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

如何实现?

2 个答案:

答案 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 }
}