在Swift中使用带有字典数组的.filter

时间:2015-08-28 21:53:08

标签: arrays swift dictionary

我有一个名为master的数组,它的类型为Array<Dictionary<String, String>>()。我正在尝试使用过滤器功能,如下所示:

filteredMusic = allSongNames.filter({ (song: String) -> Bool in
    let stringMatch = song.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch)
    return stringMatch != nil
})

其中filteredMusicallSongNames都是String数组。我尝试使用我的master数组和masterFilter(与master相同的类型)进行翻译:

masterFilter = master.filter({ (song: String, id: String) -> Bool in
    let stringMatch = song.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch)
    return stringMatch != nil
})

我的错误:

'(String, String) -> Bool' is not convertible to '([String : String]) -> Bool'

我必须弄乱语法。什么是正确的语法?

2 个答案:

答案 0 :(得分:1)

在您的过滤器关闭中,您接受了两个String参数,但您必须接受一个[String:String](即您的数组包含的类型:{{ 1}})。因此,您需要将过滤器更改为......

Dictionary<String, String>

由于您的过滤器现在接受字典而不是两个字符串,因此您需要更改它的工作方式。据推测,您希望迭代执行搜索的字典,但确切的实现取决于您尝试实现的内容。一个例子可能是:

masterFilter = master.filter({ (dictionary: [String:String]) -> Bool in
    …
})

答案 1 :(得分:0)

Array的filter实例方法的类型签名是

func filter(includeElement: (T) -> Bool) -> [T]

这意味着它接受一个带有类型T的参数并返回truefalse的函数,并且过滤器实例方法返回一个类型为T的数组,是与赋予它的函数参数相同的类型。

你第一次使用filter是有效的,因为它是一组String数据类型,虽然第二种不起作用,因为(song: String, id: String)意味着有一个函数有两个参数给{{ 1}}。编译器生成的错误完全描述了它。它说类型是字典,因此[String:String]。所以,为了使它工作,你应该这样做:

请记住,filter数据类型有一个名为Dictionary的实例变量,它返回类型为keys的值。定义是

LazyForwardCollection<MapCollectionView<[Key : Value], Key>>

var keys: LazyForwardCollection<MapCollectionView<[Key : Value], Key>> { get } 有一个实例变量LazyForwardCollection,它为您提供第一个元素,它还有first,它为您提供了所有元素。

array

我没有使用for-in循环,因为你的代码显示的方式(尽管它没有编译)我,它只在数组中的字典中有一个键/值对。虽然如果有需要你可以使用它。

您也没有使用var first: S.Generator.Element? { get } // Let the compiler infer the type though you can give (dict: [String : String]) -> Bool masterFilter = master.filter { dict in let song = dict.keys.first let stringMatch = song.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch) return stringMatch != nil } 。所以在我看来你不需要这些值,虽然字典的本质是你需要键和值,否则数组数据类型将起作用。一种可能的猜测是,您正在从返回JSON或其他符号的Web服务器检索数据,因此您首先将其转换为字典然后使用它。

相关问题