2016-03-09 4 views
0

Я создал пользовательский класс под названием MenuItem:Как найти, если массив содержит объект

import Foundation 

class MenuItem { 

    var title: String 
    var tag: Int 
    var image: UIImage 

    init (title: String, tag: Int, image: UIImage) { 
     self.title = title 
     self.tag = tag 
     self.image = image 
    } 

} 

Я добавляю эти объекты в массив.

Как проверить, содержит ли массив определенный элемент меню?

Это упрощенная версия того, что я пробовал.

let menuOptionInventory = MenuItem(title: "Inventory", tag: 100, image: UIImage(imageLiteral: "871-handtruck")) 
var menuOptions = [MenuItem]() 
menuOptions.append(menuOptionInventory) 

if (menuOptions.contains(menuOptionInventory)) { 
    //does contain object 
} 

Когда я делаю это я получаю сообщение об ошибке:

+2

Вы можете посмотреть здесь, как соответствовать equatable и/или hashable: http://stackoverflow.com/a/32953118/2227743 – Moritz

ответ

1

Попробуйте это:

if menuOptions.contains({ $0 === menuOptionInventory }) { 
    //does contain object 
} 

Edit: Как JAL отметил это сравнение указателей.

Так вместо того, чтобы вы могли переопределить оператор == специально для сравнения двух MenuItem объектов, как это:

func == (lhs: MenuItem, rhs: MenuItem) -> Bool { 
    return lhs.title == rhs.title && lhs.tag == rhs.tag && lhs.image == rhs.image 
} 

И тогда вы могли бы использовать метод закрытия содержит для выполнения сравнения между объектами.

if menuOptions.contains({ $0 == menuOptionInventory }) { 
    //does contain object 
} 
+1

Это будет сравнивать указатели, а не объект равенства IIRC (I Ждут» t downvote). – JAL

+0

Хороший вопрос! (не каламбур) –

+0

Добавлено альтернативное решение, надеюсь, может понравиться downvoter :) –

1

несколько вопросов:

contains принимает в затворе. Вы должны были бы сделать ваше сравнение, как это:

if menuOptions.contains({ $0 == menuOptionInventory }) { 
    // do stuff 
} 

Но теперь вы получите вопрос, который == не может быть применен к двум MenuItem объектов. Сопоставьте свой объект с Hashable и Equatable и определите, как два объекта MenuItem равны или используйте базовый класс, который соответствует Hashable и Equatable для вас, например NSObject.

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