检查字符串是否包含 Swift 中的可选字符串,但前提是它不是 nil

aar*_*acy 1 swift

我想向处理字符串列表的函数添加一个可选的“过滤器”参数。如果过滤器是nil,我想处理所有字符串,否则我只想处理包含过滤器的字符串。大致:

func process(items: [String], filter: String?) {
  for item in items {
    if filter == nil || item.contains(filter) {
      // Do something with item
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

类型检查器抱怨将过滤器传入,contains因为它是可选的,但contains需要一个String. 我当然可以强制展开,但这看起来很丑陋。上面的代码会在 Kotlin 中编译,因为它会巧妙地抛弃可选的,但是在 Swift 中表达它的惯用方式是什么?

谢谢!

vac*_*ama 5

有一个mapon Optional仅在 optional 不是时才执行提供的闭包nil。您可以mapnil 合并运算符 一起使用??来提供trueifmap返回的默认值,nil因为filternil

func process(items: [String], filter: String?) {
  for item in items {
    if filter.map(item.contains) ?? true {
      // process item
    }
  }
}
Run Code Online (Sandbox Code Playgroud)