Swift 2.1 как создать предикат

#swift #nspredicate

#swift #nspredicate

Вопрос:

Компилятор жалуется на свой фрагмент кода и не уверен, как исправить:

 NSProcessInfo.processInfo().environment.contains("UITESTING")
  

И он жалуется, что он cannot convert value of type STring to expected argument type '@noescape((String, String)) throws -> Bool

Я использую Xcode 7.3.1 с Swift 2.2

Ответ №1:

NSProcessInfo.processInfo().environment возвращает [String : String] словарь.

Для использования contains в словаре вы должны передать замыкание, а не строку.

Примеры для Swift 2:

 // This is just to make the answer easier to read
let env = NSProcessInfo.processInfo().environment
  

Чтобы проверить, содержат ли ключи вашу строку:

 let result = env.contains { $0.0.containsString("UITESTING") }
  

или для проверки равенства, например:

 let result = env.contains { $0.0 == "UITESTING" }
  

Чтобы проверить, содержат ли значения вашу строку:

 let result = env.contains { $0.1.containsString("UITESTING") }
  

или равно:

 let result = env.contains { $0.1 == "UITESTING" }
  

$0 является ли каждый элемент в словаре .0 ключом и .1 значением.

Чтобы лучше понять, вот синтаксис длинной формы:

 let result = env.contains { (key, value) in key.containsString("UITESTING") }
  

И в Swift 3, на случай, если кому-то это нужно:

 let env = ProcessInfo.processInfo.environment
let result = env.contains { $0.key.contains("UITESTING") }
let result = env.contains { $0.value.contains("UITESTING") }
let result = env.contains { (key, value) in key.contains("UITESTING") }