我有一个包含字符串,数组和字典混合的数组。我想检查它是否包含字典。我正在尝试以下方法,但收到错误:
if array.contains(Dictionary<String, AnyObject>) {
}
我将如何做到这一点?
答案 0 :(得分:4)
如果您不希望重载contains
方法,则不必费心 - 已经有version of it that can take a custom predicate检查每个元素以确定是否应将其视为'在数组'。
与filter
不同,它具有在找到匹配后立即返回的优势。如果你真的想要的话,你仍然可以把它变成一种扩展方法 - 但在我看来,你不应该这么简洁。
if array.contains({$0 is [String:AnyObject]}) {
print("contains dictionary")
} else {
print("doesn't contain dictionary")
}
答案 1 :(得分:3)
@Ryan,该类型不必符合Equatable
协议。
这将完成工作:
extension Array {
// This is a concise, yet inefficient implementation
func contains<T>(type type : T.Type) -> Bool {
return !filter({ $0 is T }).isEmpty
}
// Here is a more efficient implementation
func contains<T>(type type : T.Type) -> Bool {
var contains = false
for element in self {
if element is T {
contains = true
break
}
}
return contains
}
}
可以这样使用:
if array.contains(type: Dictionary<String, AnyObject>.self) {
// Run code if the array holds a dictionary of the given type
}
答案 2 :(得分:0)
这要求数组元素符合Equatable协议(Dictionary不会)。
您必须使用以下内容扩展contains:
extension Array {
func contains<T where T : Equatable>(obj: T) -> Bool {
return self.filter({$0 as? T == obj}).count > 0
}
}