【问题标题】:Swift array of dictionary , how to check any one element has greater than "one" value字典的Swift数组,如何检查任何一个元素的值大于“一”
【发布时间】:2020-07-29 14:38:34
【问题描述】:
var abc: [[String: Int ]] = 
[["a", 0, "b": 0, "c" : 1]]

在上面的例子中,我需要一个逻辑来检查字典数组是否有任何大于 1 的元素(值)。

在我的项目中,如果字典数组包含至少一个大于 1 的元素,我会将用户导航到下一个屏幕。

【问题讨论】:

  • 您尝试了哪些方法,遇到了哪些具体问题?

标签: arrays swift dictionary


【解决方案1】:

您的代码示例中有错字,但您可以使用

func ifContains(arr: [[String: Int ]], value: Int) -> Bool {
    for dict in arr {
        return dict.values.filter { $0 > 1 }.count > 0
    }
    
    return false
}

print(ifContains(arr: abc, value: 1))

【讨论】:

  • 这将不必要地迭代整个集合,即使它在第一个元素处找到它
  • 如果在第一个数组中没有找到,它将返回false,不是吗?用[["a": 0, "b": 0, "c" : 0], ["a": 2, "b": 3, "c" : 4]] 测试一下,你会看到的。此外,value 参数未使用。可能更喜欢 count 测试的 isEmpty 吗?而且由于您使用过滤器,如果子数组很大,您将完全迭代它。
  • for val in dict.values where val > value { true }
  • 顺便说一句,您没有使用方法的 value 属性
  • 如果声明类似于 var product = [[product]]() 并且 product 是类似于 struct product { price : Int = 0} 的结构,那么如何使用上述给定的逻辑..help尽快
【解决方案2】:

这应该可以解决问题:

let containsNonZeroValue = array.contains(where: { aSubDict in
    return aSubDict.contains { (key: String, value: Int) -> Bool in
        return value > 1
    }
})

我们检查不同的 aSubDict 是否包含大于 1 的字典值。

我们可以使用filter()map()flatMap() 等,但contains() 的优势在于一旦找到值就停止。因此,如果您有一个大数组,并且 2 在 1 索引处,它将不会遍历数组的其余部分。

如果您知道如何使用闭包及其参数,则以更串联的方式:

let containsNonZeroValue = array.contains(where: { $0.contains { $0.value > 1 } })

正如@Leo Dabusthe comments 中所建议的,我们可以获取所有值(aSubDict.values),而不是迭代子字典的所有值,并检查其中一个是否遵守约束。

let containsNonZeroValue = array.contains(where: { aSubDict in
    return aSubDict.values.contains(where: { $0 > 1 })
})

简而言之:

let containsNonZeroValue = array.contains(where: { $0.values.contains(where: { $0 > 1 }) })

【讨论】:

  • 只能查看字典contains{$0.values.contains{$0 > 1}}的values属性
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-07
  • 2022-01-09
  • 2020-06-09
  • 1970-01-01
  • 2022-01-25
  • 2021-05-15
  • 2012-05-31
相关资源
最近更新 更多