2017-02-11 76 views
0

所以我不知道为什么,但我有一个自定义对象筛选通过自定义阵列

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

你误解了'filter'方法。因为封闭的返回意味着:“我必须将该项目放入返回的数组中吗?”?是的,它被添加,否则,它不会被添加。根据该项目,然后由您来做适当的测试:就像在您的案例中对其名称属性进行测试一样。 – Larme

回答

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")] 

希望它能帮助!

+0

谢谢,我当时很蠢,而且我意识到我的filteredArray没有正确的数据类型,所以你的例子帮助我弄清楚了谢谢 –