我有一个名为master
的数组,它的类型为Array<Dictionary<String, String>>()
。我正在尝试使用过滤器功能,如下所示:
filteredMusic = allSongNames.filter({ (song: String) -> Bool in
let stringMatch = song.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch)
return stringMatch != nil
})
其中filteredMusic
和allSongNames
都是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'
我必须弄乱语法。什么是正确的语法?
答案 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
的参数并返回true
或false
的函数,并且过滤器实例方法返回一个类型为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服务器检索数据,因此您首先将其转换为字典然后使用它。