«Тип выражения« Bool »неоднозначен без дополнительного контекста» в троичной операции - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь передать перечисление в функцию, которая выполняет операцию над аргументами этого перечисления.Я получаю эту ошибку:

Expression type 'Bool' is ambiguous without more context

Та же ошибка происходит в эквивалентном условии if, поэтому проблема связана не с самим троичным оператором.

enum auto {
        case pkw (SerialNumber: String, Axles: Int, Weight: Float)
        case lkw (SerialNumber: String, Axles: Int, Weight: Float)
}

func checkIntegrity(car: auto) -> Bool {
        switch car {
        case .pkw:
            if (checkSerialNumber(serialNumber: .pkw.SerialNumber.rawValue)
                && checkWeight(weight: .pkw.Weight.rawValue)) { // Error here, "&&" is underlined
                    return true
                } else {
                    return false
                }
            break;
        case .lkw:
            return (checkSerialNumber(serialNumber: .lkw.SerialNumber.rawValue)
                && checkWeight(weight: .lkw.Weight.rawValue)) ? true : false; // same error here, "&&" is underlined
            break;
        default:
            return false
}

Другие вызываемые функции просто возвращают Bool:

func checkSerialNumber(serialNumber: String) -> Bool {
        return serialNumber.contains("ABABWA") // changed after a hint in the comments
}

func checkWeight(weight: Float) -> Bool {
        return (weight < 2)
}

Я подозреваю, что что-то не так с enum и как я их использую, но я пока не нашел решения.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Попробуйте это:

enum auto {
    case pkw (SerialNumber: String, Axles: Int, Weight: Float)
    case lkw (SerialNumber: String, Axles: Int, Weight: Float)
}


func checkSerialNumber(serialNumber: String) -> Bool {
    return serialNumber.contains("ABABWA") ? false : true
}

func checkWeight(weight: Float) -> Bool {
    return (weight < 2) ? true : false
}

func checkIntegrity(car: auto) -> Bool {
    switch car {
    case .pkw(let serialNumber, _, let weight):
        return (checkSerialNumber(serialNumber: serialNumber) && checkWeight(weight: weight))
    case .lkw(let serialNumber, _, let weight):
        return (checkSerialNumber(serialNumber: serialNumber) && checkWeight(weight: weight))
    }
}
0 голосов
/ 23 ноября 2018

Сообщение об ошибке вводит в заблуждение.Вы хотите проверить связанные значения перечислимого значения, поэтому вы должны связать их в шаблоне дела:

func checkIntegrity(car: auto) -> Bool {
    switch car {
    case let .pkw(serialNumber, _, weight):
        if checkSerialNumber(serialNumber: serialNumber)
            && checkWeight(weight: weight) {
            return true
        } else {
            return false
        }
        break;
    case let .lkw(serialNumber, _, weight):
        return (checkSerialNumber(serialNumber: serialNumber)
            && checkWeight(weight: weight)) ? true : false;
        break;
    default:
        return false
    }
}

Это можно упростить до

func checkIntegrity(car: auto) -> Bool {
    switch car {
    case let .pkw(serialNumber, _, weight),
         let .lkw(serialNumber, _, weight):
        return checkSerialNumber(serialNumber: serialNumber) && checkWeight(weight: weight)
    }
}
...