Быстрое закрытие: невозможно преобразовать значение типа '(_) → Bool' в ожидаемый тип аргумента

Я работаю с методом filter() в Swift, но сталкиваюсь с проблемой, которую я не могу воспроизвести на игровой площадке.

Изменить: Загружен пример проекта: https://www.dropbox.com/s/5ce5uyxnpb0mndf/WeirdSwifty.zip?dl=0

У меня есть структура Card, которая содержит CardType перечисление:

struct Card {
    var name = ""
    var type : CardType

    enum CardType {
        case Red
        case Black
    }
}

И класс Player, который поддерживает массив этих элементов Card:

class Player {
    var hand : [Card]

    init() {
        hand = ...
    }

    func redCards() -> [Card] {
        return hand.filter({ (card) -> Bool in
            return card.type == .Red
        })
    }
}

Однако Xcode выдает ошибку независимо от того, как я пытаюсь отформатировать это закрытие. Я даже позволю Xcode автозаполнять подпись/тело закрытия, думая, что у меня была синтаксическая ошибка, но она воссоздает ее так же (правильно?) Способ:

введите описание изображения здесь

Я также пробовал редактировать то, что Xcode автоматически создает и предоставляет более простую версию, безрезультатно:

введите описание изображения здесь

Аналогично:

введите описание изображения здесь

Как я уже упоминал, я не могу воспроизвести это на простом игровом поле, но я не могу сузить, что фактически вызывает проблему в моем основном проекте.

Это единственная ошибка в моем проекте, и если я прокомментирую метод, содержащий вызов filter(), он строит правильно.

Является ли эта ошибка общей красной селедой для какой-то другой актуальной проблемы?

Примечание. Использование Xcode 7.3.1 (7D1014)

Ответ 1

Что-то чешуйчатое происходит с помощью вывода типа Swift. Дайте card явный тип, и он будет работать.

return hand.filter({ (card: Card) -> Bool in return card.type == .Red })

Вам не нужен тип возврата или возврат:

return hand.filter({ (card: Card) in card.type == .Red })

Примечание: это также работает:

return hand.filter({ ($0 as Card).type == .Red })

Полностью указывая значение .Red enum, также устраняет проблему:

return hand.filter({ $0.type == Card.CardType.Red })

В комментариях упоминалось, что если вы переместите определение card в тот же файл, что и фильтр, он работает. На самом деле, если вы разделите определение CardType enum из card и просто переместите CardType в файл с фильтром, он будет работать.