Проверьте, содержит ли словарь значение в Swift

swift nsdictionary nspredicate

14791 просмотра

3 ответа

0 Репутация автора

Просто простая задача. У меня есть словарь, var types = [Int : String]()который начинается как пустой, и после некоторых действий пользователя он заполняется данными. Согласно пустоте или некоторым конкретным данным в этом словаре я включаю / отключаю кнопку в пользовательском интерфейсе. Проверить пустоту легко, но как проверить, содержит ли словарь определенное значение? Компилятор предложил мне заполнитель с предикатом:

types.contains(predicate: ((Int, String)) throws -> Bool>)
Автор: user6485277 Источник Размещён: 19.07.2016 06:43

Ответы (3)


7 плюса

38444 Репутация автора

Решение

Поскольку вы хотите проверять только наличие заданного значения , вы можете применить containsметод для valuesсвойств вашего словаря (заданного родного словаря Swift), например

var types: [Int : String] = [1: "foo", 2: "bar"]
print(types.values.contains("foo")) // true

Как уже упоминалось в @njuri: answer , использование valuesсвойства словаря может привести к дополнительным затратам (я сам не проверял), если просто проверять containsпредикат непосредственно по записи значения в кортеже ключ-значение каждого Dictionaryэлемента. Поскольку Swift быстр, это не должно быть проблемой, если только вы не работаете с огромным словарем. В любом случае, если вы хотите избежать использования valuesсвойства, вы можете взглянуть на альтернативы, указанные в вышеупомянутом ответе, или использовать другую альтернативу ( Dictionaryрасширение) следующим образом:

extension Dictionary where Value: Equatable {
  func containsValue(value : Value) -> Bool {
    return self.contains { $0.1 == value }
  }
}

types.containsValue("foo") // true
types.containsValue("baz") // false
Автор: dfri Размещён: 19.07.2016 06:47

3 плюса

3810 Репутация автора

Я написал функцию, которая использует containsметод в словаре.

Ваш конкретный случай:

let dic : [Int : String] = [1 : "a", 2 : "b"]

func dictionary(dict : [Int : String], containsValue value : String)->Bool{

  let contains = dict.contains { (_,v) -> Bool in
      return v == value
  }
  return contains
}

let c = dictionary(dic, containsValue: "c") // false
let a = dictionary(dic, containsValue: "a") // true

Общий:

extension Dictionary{
  func containsValue<T : Equatable>(value : T)->Bool{
    let contains = self.contains { (k, v) -> Bool in

      if let v = v as? T where v == value{
        return true
      }
      return false
    }
    return contains
  }
}

Я протестировал эту функцию, dictionary.values.contains()и она примерно в два раза быстрее.

Автор: Juri Noga Размещён: 19.07.2016 06:51

1 плюс

3200 Репутация автора

Если вы хотите проверить, содержит ли уже значение, это будет так:

if !yourDictionary.values.contains("Zero") {
   yourDictionary[newItemKey] = newItemValue; //addNewItem
}
else {
    print("this value already exists");
}

И этот, если вы хотите проверить, существует ли ключ :

  1. Вы получаете элемент для добавления в свой словарь.
  2. Проверьте, существует ли ключ элемента
  3. Если это не так, добавьте элемент или включите кнопку.

    //1
    let newItemKey = 0
    let newItemValue = "Zero"
    //2
    let keyExists = yourDictionary[newItemKey] != nil
    //3
    if !keyExists {
        yourDictionary[newItemKey] = newItemValue; //addNewItem
    }
    else {
    print("This key already exists");
    }
    
Автор: Victor Rius Размещён: 19.07.2016 07:02
Вопросы из категории :
32x32