【问题标题】:Compile time assert in Swift?在 Swift 中编译时断言?
【发布时间】:2014-06-12 05:06:16
【问题描述】:

是否可以像 C++ 中的 static_assert 一样在 Swift 中编写编译时断言?也许有某种方法可以利用泛型的类型约束来强制编译器中断?

【问题讨论】:

  • 我不知道它有什么用处。并且 Swift 已经可以使用where 来约束泛型
  • 类似#error?
  • 我只提到了约束泛型作为潜在的实现方法,而不是我想要断言的。在我的例子中,我定义了大量相互关联的编译时常量整数,我想在编译时进行验证。我通常会在 C++ 中使用 static_assert 的东西。
  • 我不完全确定 Swift 实际上有编译时常量。无论如何,一个普通的assert 几乎可以完成同样的工作。
  • @Sulthan:不,不会。在编译时(在您发布之前)捕获错误和在运行时当用户通过崩溃发现错误时(也就是说,如果断言在您的发布版本中仍然存在,而通常不是,那么可能会发生奇怪的事情)。因此,如果您可以让编译器捕获尽可能多的问题,那就太好了。

标签: swift assert static-assert


【解决方案1】:

这已在 Swift 4.2 版本中被接受,这里是提案的Swift evolution

【讨论】:

    【解决方案2】:

    如果您谈论的是一般断言,如果给定条件失败,应用程序将崩溃,只需使用:assert(condition,message)

    例如:assert(2 == 3,"failing because 2 does not equal 3")

    这在 Swift 中是可能的。但是,我应该指出,Apple 的设计理念是应用程序永远不应该崩溃,而是应该以“复杂”的方式处理所有错误。

    【讨论】:

    • 您指的是正常的运行时断言。我要问的是编译时断言,如 C++ 中的 static_assert。这用于静态可验证表达式,当它们失败时会导致编译器错误。
    • Neil,对不起,我没有真正关注——我没有使用 static_assert。 Swift 书中基础部分的最后简要提到了断言。我没有看到任何关于编译时断言的内容,如您所要求的。我不知道他们是否支持他们。链接:developer.apple.com/library/prerelease/ios/documentation/Swift/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    相关资源
    最近更新 更多