检查数组是否包含某些内容 - Swift 4

时间:2017-06-12 18:44:30

标签: arrays swift

我发现.contains(Element)方法在编写Swift代码的最小经验中非常重要,并且很快就意识到Apple改变了它...

func contains(check:[[[Int]]], forElement: [[Int]]) -> Bool {
    for element in check {
        if areEqual(element, forElement) {
            return true
        }
    }
    return false
}
func areEqual(_ a:[[Int]], _ b:[[Int]]) -> Bool {
    for i in 0..<a.count {
        if a[i] != b[i] {
            return false
        }
    }
    return true
}

我一直在搞乱一些大型数组,所以我用那个笨重的函数解决了我的问题。

发生了什么事?

您如何使用the new way

那里的例子很好,我确信他们打算这样做。

enum HTTPResponse {
    case ok
    case error(Int)
}

let lastThreeResponses: [HTTPResponse] = [.ok, .ok, .error(404)]
let hadError = lastThreeResponses.contains { element in
    if case .error = element {
        return true
    } else {
        return false
    }
}
// 'hadError' == true

2 个答案:

答案 0 :(得分:24)

如何使用此

let numbers = [1, 2, 3, 4]
let contains = numbers.contains(where: { $0 == 3 })
//contains == true

或者

let strings = ["A", "B", "C", "D"]
let contains = strings.contains(where: { $0 == "B" })
//contains == true

即使使用其他对象,例如NSColor

let colors: [NSColor] = [.red, .blue, .green]
contains = colors.contains(where: { $0 == .red })
//contains == true

答案 1 :(得分:3)

该API只允许您传递一个块,您可以在其中执行所需的任何检查。您可以检查给定元素是否等于某个东西,或者它的属性是否满足某些约束(例如在文档中的示例中)。你应该能够执行这样的基本相等检查:

func contains(check:[[[Int]]], forElement: [[Int]]) -> Bool {
    return check.contains { element in
        return areEqual(element, forElement)
    }
}

func areEqual(_ a:[[Int]], _ b:[[Int]]) -> Bool {
    for i in 0..<a.count {
        if a[i] != b[i] {
            return false
        }
    }
    return true
}

contains块迭代每个元素并返回truefalse。最后,对于任何元素,单个true将为整个函数返回true