Ошибка: «Отсутствует возвращение в функции, ожидающей возврата Int» - PullRequest
1 голос
/ 27 марта 2020

Первая функция, представленная ниже, прекрасно работает для проверки значений FM, но когда я добавил некоторую проверку в оператор else if для значений AM, я получаю сообщение об ошибке: Missing return in a function expected to return Int. Кажется, это не проблема с размещением фигурных скобок.

        static var minAMFFrequency: Double = 520.0
        static var maxAMFFrequency: Double = 1610.0
        static var minFMFFrequency: Double = 88.3
        static var maxFMFFrequency: Double = 107.9

    func isBandFM() -> Int {
        if frequency >= RadioStation.minFMFFrequency && frequency <= RadioStation.maxFMFFrequency {
            return 1 //FM
        } else {
            return 0 //AM
        }
    }

Изменена функция с ошибкой:

func isBandFM() -> Int {
        if frequency >= RadioStation.minFMFFrequency && frequency <= RadioStation.maxFMFFrequency {
            return 1 //FM
        } else if frequency >= RadioStation.minAMFFrequency && frequency <= RadioStation.maxAMFFrequency{
            return 0 //AM
        }
    }

Ответы [ 2 ]

2 голосов
/ 27 марта 2020

Вам также необходимо рассмотреть случаи, которые не попадают в 2 условия. Ожидается, что вы предоставите возвращаемое значение по умолчанию.

В первом случае возвращаемое значение по умолчанию равно 0.

Во втором случае, если ваш frequency не находится ни в В первом диапазоне (указанном первым условием if) и во втором диапазоне (указанном вторым условием if) необходимо указать возвращаемое значение по умолчанию.

func isBandFM() -> Int {
        if frequency >= RadioStation.minFMFFrequency && frequency <= RadioStation.maxFMFFrequency {
            return 1 //FM
        } else if frequency >= RadioStation.minAMFFrequency && frequency <= RadioStation.maxAMFFrequency{
            return 0 //AM
        }

        return 0   // or whatever value you want to return if frequency is not within FM range or AM range
}
1 голос
/ 27 марта 2020

Санил уже объяснил проблему здесь, но я предложу некоторые другие улучшения

Это лучше выразить, используя соответствующие типы:

  1. A Range<Double> вместо двух отдельных Double s
  2. A Boolean вместо 0 / 1 Int.
  3. enum для представления именованных полос частот, например «AM», « FM "или" прочее "
struct RadioStation {
    enum Band {
        case am, fm, other
    }
    static let amFrequencyRange = 520.0...610.0
    static let fmFrequencyRange = 88.3...107.9

    let frequency: Double

    var isFM: Bool { RadioStation.fmFrequencyRange.contains(frequency) }
    var isAM: Bool { RadioStation.amFrequencyRange.contains(frequency) }

    var band: Band {
        if self.isFM { return .fm }
        else if self.isAM { return .am }
        else { return .other }
    }
}
...