2015-07-24 5 views
0

Вот фрагмент кода, где я получаю ошибку синтаксиса я не понимаю:Как вызвать Swift Array.indexOf?

let deal:[Card] = self.cards 
     for hand in hands { 
      var data:[Int] = [] 
      for card:Card in hand.cards { 
       let idx = deal.indexOf(card) 
       data.append(idx!) 
      } 
     } 

Я получаю ошибку «не может ссылаться на„IndexOf“с аргументом типа" (карта)». Я этого не понимаю. сделка [карта]. Что я должен вызвать deal.indexOf, если не карту? Подпись для CollectionType.indexOf в документах:

func indexOf (элемент: Self.Generator.Element) -> Self.Index?

Если сделка является [Картой], не является Я.Генератором. Элемент равен Карте? Я даже добавляю аннотации типа, чтобы проверить, что мои переменные имеют типы, которые я ожидаю. Что мне не хватает? (Как это бывает, карта является структурой, но я получаю ту же ошибку, если меняю ее на класс.)

ответ

6

Проблема в том, что вы не определили, что означает, что одна карта будет равна другой. Таким образом, Свифт не может знать, что индекс данной Карты находится внутри массива, поскольку он не может идентифицировать желаемую Карту, когда она ее видит. Вам необходимо объявить Карту как Equatable и выполнить требования этого протокола.

+0

См., Например, мой ответ здесь: http://stackoverflow.com/a/24400073/341994 Он касается старого предшественника 'indexOf', а именно' find', но принцип точно такой же. – matt

+0

Это сделало, спасибо. Я хочу, чтобы сообщение об ошибке было более конкретным, но я никогда не видел компилятора, чьи сообщения об ошибках мне нравились. – saulspatz

+0

Ну, лучше посмотреть в заголовках, чем в документах. Если вы это сделаете, вы ясно увидите, что 'indexOf' не определен в CollectionType простой и простой, но в' CollectionType, где Generator.Element: Equatable'. – matt

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