通过自定义数组过滤

时间:2017-02-11 23:11:29

标签: swift

所以我不确定为什么,但我有一个自定义对象

struct Country {
  id: Int,
  name: String
}
//List of Countries
dataArray = [Country]()

//Error: "Cannot invoke filter with an arg list of type ((Country)) throws -> Bool

filteredArray = dataArray.filter({ (country) -> Bool in
   let countryText:NSString = country.name as NSString
   return (countryText.range(of: searchString, options: NSString.CompareOptions.caseInsensitive).location) != NSNotFound
})

如果dataArray是一个字符串列表而不是它可以工作,我只是不明白为什么,看着其他SO问题我返回一个布尔值

Filter array of custom objects in Swift

Swift 2.0 filtering array of custom objects - Cannot invoke 'filter' with an argument of list type

1 个答案:

答案 0 :(得分:0)

过滤器关闭中的问题是((Country)) throws -> Bool类型应该是Country -> Bool

这告诉你的是你的闭包在你的代码中有一些可能会失败并抛出错误的部分。编译器不知道如何解释失败,因此闭包不会抛出错误。

查看您的代码,可能是由String转换为NSString。我试图在我的机器中重现你的代码(Swift 3,Ubuntu 16.04)并且它在演员阵容中失败了。我的解决方案是使用NSString的构造函数来接收String并且它有效

更新的代码:

struct Country {
  var id: Int
  var name: String
}

//List of Countries
let dataArray = [Country(id: 1, name: "aaaaaaa"), Country(id: 1, name: "bbbb")]

let filteredArray = dataArray.filter({ (country) -> Bool in
   let countryText: NSString = NSString(string: country.name)
   return (countryText.range(of: "aaa", options:   NSString.CompareOptions.caseInsensitive).location) != NSNotFound
})

print(filteredArray)

打印:

[helloWorld.Country(id: 1, name: "aaaaaaa")]

希望它有所帮助!