所以我不确定为什么,但我有一个自定义对象
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
答案 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")]
希望它有所帮助!