Быстрое закрытие: невозможно преобразовать значение типа '(_) → 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
в файл с фильтром, он будет работать.