Swift中使用Contains的正确姿势

1.正确姿势

当我们在用Swift进行编码的时候,经常会用到contains(element:)方法来判断Array是否包含了某个元素。举个栗子:

enum Animal {
  case dog
  case cat
}
let animals: [Animal] = [.dog, .dog]
let hasCat = animals.contains(.cat)       // fasle
复制代码

看起来灰常的简单对不?然鹅,我们把Animal的枚举定义修改成带参数的枚举,比如这样:

enum Animal {
  case dog(String)
  case cat(String)
}
let animals: [Animal] = [.dog("汪汪"), .dog("阿黄")]
let hasCat = animals.contains(.cat("喵喵"))      // compile error  
复制代码

编译报错了,为毛? 原因是能使用contains(element:)的元素是需要遵循Equatable协议的,但是Animal是没有遵循的,所以会报错。

那肿么办?幸好苹果还提供了另外一个方法来判断

public func contains(where predicate: (Element) throws -> Bool)
rethrows -> Bool
复制代码

这个方法提供了一个闭包参数—— predicate,当数组中的元素没有遵循Equatable协议时,我们可以用这个参数来定义检查元素的规则。

所以之前代码中的错误代码改成这样:

enum Animal {
    case dog(String)
    case cat(String)
}

let animals : [Animal] = [.dog("汪汪"), .dog("阿黄")]
let hasCat = animals.contains { (animal) -> Bool in
    
    if case .cat = animal {
        return true
    }
    
    return false
}

// fasle
复制代码

这么改hasCat就能正确计算出是false了。

2.进阶用法

另外,我们可以自定义predicate,来定义检查筛选的条件,比如: 检查数组中是否有元素大于100。

let expenses = [21.37, 55.21, 9.32, 10.18, 388.77, 11.41]
let hasBigPurchase = expenses.contains { $0 > 100 }
// 'hasBigPurchase' == true
复制代码

再给个栗子:检查一个数组的元素,它可是否以除以7。

let array = [2, 5, 6, 7, 19, 40]

array.contains { (element) -> Bool in
    element % 7 == 0
}
或者
array.contains { $0 % 7 == 0 } 
复制代码

这里的$0就是指数组的元素;

原文链接: Contains in Swift -- by 故胤道长(英文博客,需要科学上网工具) 官方文档

转载于:https://juejin.im/post/5a9cd82f6fb9a028b77a4c81

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值