代码之家  ›  专栏  ›  技术社区  ›  Boon

为什么Swift的类型检查系统允许返回类型的函数不返回任何东西?

  •  1
  • Boon  · 技术社区  · 4 年前

    为什么以下代码有效?

    func square(_ x: Int) -> Int {
      fatalError()
    }
    

    fatalError()从不返回任何东西(或者更确切地说,它返回never)。为什么类型系统在这里不会捕捉到func不返回Int的问题,即使它说会返回Int?

    2 回复  |  直到 4 年前
        1
  •  4
  •   Sweeper    4 年前

    因为 fatalError 退货 Never 从文献中可以看出, 从未 是,

    不正常返回的函数的返回类型,即没有值的类型。

    通过编译器魔法,Swift理解 致命错误 “未正常返回”,即应用程序崩溃。这就是为什么它不抱怨 square 不返回a Int .

    如果函数的路径调用了“不正常返回”的函数,则该路径也不正常返回。“不正常返回”意味着调用者将无法使用返回值,因此在函数的该路径中强制执行“必须返回值”规则是没有意义的。

        2
  •  1
  •   user2864740 BINIT kumar jha    4 年前

    认为a throw 可以被概念化为具有Never类型。它的工作方式与进一步的代码执行相同,包括在 这简直不合逻辑。

    func square(_ x: Int) -> Int {
        throw TooManyDotsError()
    }
    

    在调用类型为的函数时也接受此行为 -> Never 允许两者之间的统一 fatalError() .

    声明以下闭包、函数或方法时,使用Never作为返回类型 无条件抛出错误[作为 语句会]、陷阱或以其他方式不终止 .

    方法的返回类型表示 如果 该方法返回,它必须返回给定类型的值。调用Never方法,如 , 禁止返回 在给定的分支上。

    为了展示这是如何有用的,请比较没有将其内置到类型系统中的语言,例如C#:

    int F() {
        // guaranteed to throw, but not known to type system
        AlwaysThrow();
        // dummy throw to appease type system
        throw Exception("Not reachable");
    }