2016-03-10 4 views
0

У меня есть словарь:Удалить AnyObject из словаря Swift

var dict:[NSObject:[AnyObject]] 

Я хочу, чтобы удалить объект из словаря по значению.

func removeObject(anObject:AnyObject) { 
    for key in dict.keys { 
     dict[key] = dict[key]!.filter({$0 == anObject}) 
    } 
} 

, но я получаю эту ошибку:

Binary operator '==' cannot be applied to two 'AnyObject' operands 

Какой самый лучший способ, чтобы удалить этот объект? Я хочу сохранить его как можно более общим.

+2

ли они ссылочно эквивалентны? Если это так, используйте '==='. –

+0

Вы не можете сравнить 'AnyObject', потому что, возможно, первым объектом является' Circle', а второй объект 'Giraffe', как вы можете их сравнить? если вы перетасовываете и только затем cmpare –

+0

В зависимости от того, что вы пытаетесь выполнить, одним из вариантов является использование NSObject: http://stackoverflow.com/questions/34835359/compare-two-nsobject-in-swift?rq = 1 – PeejWeej

ответ

0

Если вы хотите удалить объект, которые являются семантически равен к anObject, это и элементы в массиве должны соответствовать протоколу Equatable. Сделайте вашу функцию родовое один так:

var dict = [NSObject:[AnyObject]]() 

dict["key1"] = [1,2,3,"Hello world"] 
dict["key2"] = [3,4,5] 

func removeObject<T: Equatable>(anObject: T) { 
    for key in dict.keys { 
     dict[key] = dict[key]!.filter { 
      if let element = $0 as? T where element == anObject { 
       return false 
      } else { 
       return true 
      } 
     } 
    } 
} 

// Remove all number 3 
removeObject(3) 

print(dict) 

Обратите внимание, что это может иметь некоторые странные результаты:

dict["key1"] = [1, 2, 3] 
dict["key2"] = [4, 3.4, 3.9] 

removeObject(3.0) // 3.4 and 3.9 remain 
removeObject(3)  // 3.4 and 3.9 gone 

Это потому, что 3,4 и 3,9 стали 3, когда вы приводите их Int

Смежные вопросы