Перечисление сопоставления с образцом в качестве параметра для вызова функции - PullRequest
0 голосов
/ 17 сентября 2018

Я настроил игровую площадку с примером:

enum CarType : Equatable {
    case wheeled(wheels: Int)
    case flying

    public static func ==(lhs: CarType, rhs: CarType) -> Bool {
        return lhs.enumName == rhs.enumName
    }

    var enumName: String {
        let stuff = "\(self)".split(separator: "(").first!
        return String(describing: stuff)
    }

}


var typesPresentAtMyParty = [CarType.wheeled(wheels:4), .wheeled(wheels:4), .flying]

let aKnownType = CarType.flying

if case aKnownType = typesPresentAtMyParty[2] {
    print("Was the type")
}

func isPresent(type: CarType, inArray: [CarType]) -> Bool {

    return inArray.filter {
        if case type = $0 {
            return true
        }
        return false
    }.first != nil

}

func isWheeled(inArray: [CarType]) -> Bool {

    return inArray.filter {
        if case .wheeled = $0 {
            return true
        }
        return false
        }.first != nil

}


isPresent(type: .flying, inArray: typesPresentAtMyParty)
isPresent(type: .wheeled, inArray: typesPresentAtMyParty) 

Последняя строка здесь не компилируется.Хотя я могу сделать if case .wheeled = $0 игнорируя связанный тип как проверку, я не могу найти способ сделать то же самое при вызове функции isPresent(type: CarType, inArray: [CarType]), при отправке isPresent(type: .wheeled, inArray: typesPresentAtMyParty)

Есть ли способ написания функциикоторый принимает в качестве параметра только допустимую часть сопоставления с образцом?

1 Ответ

0 голосов
/ 25 сентября 2018

Невозможно передать частично построенные перечисления в функцию.Частично построенные перечисления не являются допустимыми значениями, и они работают только при сопоставлении с шаблоном, потому что у компилятора есть конкретное значение для работы - с правой стороны шаблона.

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

Во-первых, вам не нужно isPresent, вы можете просто использовать содержит:

typesPresentAtMyParty.contains { $0 == .flying }
typesPresentAtMyParty.contains { if case . wheeled = $0 { return true } else { return false } } 

Аналогично, isWheeled может быть сокращено (и переименован для лучшей семантики):

func isWheeled(_ carType: CarType) -> Bool {
    if case . wheeled = carType { return true } else { return false }
}

, который может быть передан в contains:

let hasWeeled = typesPresentAtMyParty.contains(where: isWheeled)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...