Swift 2使用"包含"具有多维数组的函数

时间:2016-03-05 08:22:46

标签: swift multidimensional-array

我正在尝试查找数组中是否存在(字符串)元素的简单任务。 "包含"函数与一维数组一起使用,但不在二维数组中。 有什么建议? (有关此功能的文档似乎很少,或者我不知道在哪里查看。)

5 个答案:

答案 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][]")
}