我正在尝试查找数组中是否存在(字符串)元素的简单任务。 "包含"函数与一维数组一起使用,但不在二维数组中。 有什么建议? (有关此功能的文档似乎很少,或者我不知道在哪里查看。)
答案 0 :(得分:3)
Swift标准库没有"多维数组",
但如果您参考"嵌套数组" (即阵列数组)然后
嵌套的contains()
可以使用,例如:
let array = [["a", "b"], ["c", "d"], ["e", "f"]]
let c = array.contains { $0.contains("d") }
print(c) // true
这里内部contains()
方法是
public func contains(element: Self.Generator.Element) -> Bool
,外部contains()
方法是基于谓词的
public func contains(@noescape predicate: (Self.Generator.Element) throws -> Bool) rethrows -> Bool
只要在一个元素中找到给定元素,就会返回true
内部数组。
这种方法可以推广到更深的嵌套级别。
答案 1 :(得分:2)
针对Swift 3进行了更新
现在flatten
方法已重命名为joined
。所以用法是
[[1, 2], [3, 4], [5, 6]].joined().contains(3) // true
对于多维数组,您可以使用flatten
减少一维。所以对于二维数组:
[[1, 2], [3, 4], [5, 6]].flatten().contains(7) // false
[[1, 2], [3, 4], [5, 6]].flatten().contains(3) // true
答案 2 :(得分:0)
不如J.Wangs回答,但另一种选择 - 您可以使用reduce(,combine:)函数将列表缩减为单个布尔值。
.section
答案 3 :(得分:0)
你也可以写一个扩展名(Swift 3):
extension Sequence where Iterator.Element: Sequence {
func contains2D(where predicate: (Self.Iterator.Element.Iterator.Element) throws -> Bool) rethrows -> Bool {
return try contains(where: {
try $0.contains(where: predicate)
})
}
}
答案 4 :(得分:-1)
let array = [["a", "b"], ["c", "d"], ["e", "f"]]
var c = array.contains { $0.contains("d") }
print(c) // true
c = array.contains{$0[1] == "d"}
print(c) // true
c = array.contains{$0[0] == "c"}
print (c) // true
if let indexOfC = array.firstIndex(where: {$0[1] == "d"}) {
print(array[indexOfC][0]) // c
print(array[indexOfC][1]) // d
} else {
print ("Sorry, letter is not in position [][letter]")
}
if let indexOfC = array.firstIndex(where: {$0[0] == "c"}) {
print(array[indexOfC][1]) // d
print(array[indexOfC][0]) // c
} else {
print ("Sorry, letter is not in position [letter][]")
}