2016-05-20 2 views
0
var items = [Any]() 

Я хочу найти индекс объекта User (в данном случае класс).Как найти индекс элемента в массиве из [Any]()?

items.indexOf(myUserInstance) выдает ошибку (Невозможно преобразовать значение типа 'User' ожидаемого типа аргумента «@noescape (любой) броски -> Bool)

items.indexOf(myUserInstance as? Any) бросает ошибку тоже.

Есть ли простое расширение, которое позволит мне использовать indexOf? Прямо сейчас, я зацикливание каждого пункт, тип-кастинг, и проверки, если свойство ID равно ...

+0

Почему вы не делаете массив Пользователя как 'var items = [User]()' –

+0

Потому что я хочу, чтобы массив был [Any](). Иногда я помещаю в него '' 'User''', иногда я помещаю в него структуры и т. Д. – TIMEX

+0

' '' [AnyObjects]() '' 'не позволяют мне добавлять структуры внутри. – TIMEX

ответ

0

// мы можем retrive индекса, как этот

(items as! NSArray).indexOfObject(user) 
+0

Это не возвращает необязательный. Как я могу заставить его возвращать нуль, если элемент не внутри? – TIMEX

+0

затем используйте (элементы как NSArray) .containsObject (user) –

+0

it return Bool value –

1

можно попробовать что-то вроде

items.indexOf { x in 
     if let u = x as? User { 
      if(u === user){ 
       return true; 
      } 
     } 

     return false 
    } 

может быть более элегантный способ написания, но вот и все я получил до сих пор

+0

Я бы хотел проверить конкретный экземпляр. Разве это не просто проверка типа? – TIMEX

+0

oh я сделал ошибку раньше, вы можете попробовать мой обновленный метод – Fonix

+0

Я думаю, что это сработает, но не будет ли 'if (u === user) {', чтобы убедиться, что это тот же экземпляр объекта? –

0

Как насчет items.indexOf { $0 as? User === user }?

Это вернет необязательный, содержащий либо первый индекс объект User в массиве, либо nil (.None), если пользователь не находится в коллекции.

Если User класс deriver от NSObject и переопределяет метод isEqual:, то вы можете использовать == оператор вместо === также найти объекты, которые равны по содержанию; == вызовет метод isEqual: за кулисами вместо сравнения указателей, так же как ===.

+0

Я пытаюсь сопоставить его с точным экземпляром. Соответствует ли это этому экземпляру или классу? – TIMEX

+0

@TIMEX жаль, что я этого не заметил, хотя вы хотите найти первый объект «Пользователь» в контейнере. Я обновил свой ответ, чтобы отразить ваш запрос. – Cristik