【问题标题】:Error: 'Missing return in a function expected to return Int'错误:“预期返回 Int 的函数中缺少返回值”
【发布时间】:2020-07-08 15:01:38
【问题描述】:

下面的第一个函数可以很好地检查 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
        }
    }

【问题讨论】:

  • 如果frequency 既不在AM 也不在FM 波段,isBandFM() 应该返回什么?编译器无法为你猜测。
  • 如果你最终写出类似return 1 //FM 的东西,那就是代码异味。你知道1 不清楚,所以你觉得有必要用评论来解释它。相反,您应该考虑将Int(在这种情况下是一个非常“弱”的类型)替换为“更强”且更具自我描述性的东西,例如enum。我建议你看看youtube.com/watch?v=_S6UOrwS-Tg

标签: ios swift if-statement return


【解决方案1】:

您还需要考虑不属于这两种情况的情况。它希望您提供默认返回值。

在第一种情况下,返回的默认值是 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
}

【讨论】:

  • 感谢 Sanil - 这修复了错误,我将在此处包含代码以涵盖任何超出范围的值。
【解决方案2】:

Sanil 已经在这里解释了这个问题,但我会建议一些其他改进

使用适当的类型可以更好地表达这一点:

  1. 一个Range&lt;Double&gt; 而不是两个单独的Doubles
  2. Boolean 而不是0/1Int
  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 }
    }
}

【讨论】:

  • 感谢您的打扰。非常感谢您的帮助和这个惊人的重构。太有用了!
  • 我可以将结构更改为类吗?这个想法是 RadioStation 是类定义,我也从中创建了一个 FM 和一个 AM 电台。我可以用结构而不是类来做到这一点吗?
  • 为什么需要它作为一个类? “这个想法是 RadioStation 是类定义,我也从中创建了一个 FM 和一个 AM 电台”是的。您应该阅读有关结构和 Swift 语言指南的更广泛的信息:docs.swift.org/swift-book/LanguageGuide/…
  • 当您想根据类定义创建单独的实例时,我认为类是用于子类化的?我需要了解按值传递与按引用传递。
  • 这些都不是特定于类的。请阅读 Swift 语言指南。
猜你喜欢
  • 2019-05-14
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多