您好我正在尝试使用各种对象搜索数组,但我收到错误。
通用参数'C.Generator.Element'不能绑定到非@ ob
这是我正在使用的代码:
var arraySearching = [Any]()
arraySearching = ["this","that",2]
find(arraySearching, 2)
如何搜索[Any]
类型的数组?
答案 0 :(得分:5)
这是一个误导性的错误消息,但问题是find
要求您搜索的集合的内容为Equatable
,而Any
则不是。事实上你根本不能对Any
做很多事情,更不用说将它与其他类型的值等同起来。你必须将其转换为真实类型,然后使用它。
在闭包中很容易做到,除了没有find
的版本需要关闭。但是写一个很容易:
func find<C: CollectionType>(source: C, match: C.Generator.Element -> Bool) -> C.Index? {
for idx in indices(source) {
if match(source[idx]) { return idx }
}
return nil
}
完成此操作后,您可以使用它在Any
数组中搜索特定类型的值:
find(arraySearching) {
// cast the candidate to an Int, then compare (comparing an
// optional result of as? works fine, nil == 2 is false)
($0 as? Int) == 2
}