检查数组中是否包含某个元素 - Swift 4

10

在我写Swift代码的经验中,我发现.contains(Element)方法非常重要,并且很快意识到苹果公司对其进行了更改...

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
}

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

发生了什么?

你怎么使用新方法

那里的示例超出了我的理解范围。

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

你要调用 contains 的数组中有哪些值?你能展示一些你尝试使用 contains 的代码吗? - AdamPro13
实际上,在Swift 3中也有contains(where:) - vadian
1
我不知道在Swift 4中是否对contains(_:)contains(where:)进行了任何更改 - 您能否详细说明您认为发生了什么变化? [[Int]]不是Equatable,因为我们还没有条件一致性 - 因此,您应该使用contains(where:)和嵌套数组的==重载进行比较,请参见https://dev59.com/4VwX5IYBdhLWcg3wySB1以了解如何定义它。 - Hamish
2个回答

32

用这个怎么样?

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
无效的解决方案。 - Vinit Ingale
1
@VinitIngale 这对我有效,您能详细说明一下吗? - boliva

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
}

包含块会迭代每个元素并返回truefalse。最后,任何元素的单个true都将使整个功能返回true


@Hamish 修复了闭合括号。忘记了嵌套数组部分,正在查看。 - Dima
我修改了代码,使用了问题中的areEqual函数,因为正如@Hamish指出的那样,没有针对嵌套数组的内置重载。 - Dima

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接