【问题标题】:Swift: weird behavior of assertionFailure in release buildSwift:发布版本中断言失败的奇怪行为
【发布时间】:2018-11-21 08:47:11
【问题描述】:

在我看来,assertionFailure 在发布版本中将被忽略。但是当我在发布模式下运行下面的代码时,assertionFailure 可以运行和停止程序。为什么?

代码

enum MessageType: RawRepresentable {
    case news
    case unknownMessageType(value: String)

    init?(rawValue: String) {
        assertionFailure("Tihs assertionFailure will never stop execution")
        switch rawValue {
        case "A":
            self = .news
        case "B":
            self = .news
        case "C":
            self = .news
        case "D":
            self = .news
        case "E":
            self = .news
        case "F":
            self = .news
        case "G":
            self = .news
        case "H":
            self = .news
        case "I":
            self = .news
        case "J":
            self = .news
        case "K":
            self = .news
        case "L":
            self = .news
        case "M":
            self = .news
        case "N":
            self = .news
        case "O":
            self = .news
        case "P":
            self = .news
        case "Q":
            self = .news
        case "R":
            self = .news
        case "S":
            self = .news
        case "T":
            self = .news
        case "U":
            self = .news
        default:
            assertionFailure("This assertionFailure will cause a fatal error and stop execution")
            self = .unknownMessageType(value: rawValue)
        }
    }

    var rawValue: String {
        switch self {
        case .news:
            return "A"
        case .unknownMessageType(value: let value):
            return value
        }
    }
}

此语句会导致崩溃 let message = MessageType(rawValue: "aaaa"),由第二个 assertionFailure 引起,而不是第一个。

另一个奇怪的事情是如果我在函数init?(rawValue: String) 中删除任何两个case(至少两个case),assertionFailure 将被忽略,不会出现任何崩溃。 PS,我没有禁用发布版本的优化。

于 2018 年 11 月 29 日编辑

我在Apple Developer Forum 上发布了一个帖子,这似乎是一个编译器错误。

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    我在Apple Developer Forum 上发布了一个帖子,这似乎是一个编译器错误。

    【讨论】:

      【解决方案2】:

      根据文件

      在 -O 构建(Xcode 发布配置的默认设置)中,停止 程序执行。

      在 -Ounchecked 构建中,优化器可能假设此函数是 从来没有打电话。

      所以它在发布版本中表现正确。即停止执行。

      【讨论】:

      • 感谢您的回复。在 Apple 的开发文档中,'In -O builds, has no effect。 developer.apple.com/documentation/swift/…。所以在发布版本中,assertionFailure 不应该生效。如果我在 'init?(rawValue: String)' 的开头添加 assertionFailure,程序将不会停止。看来你的答案不对。
      • 同意。我的错。这是为了 preconditionFailure(_:file:line:)
      • 与怪异无关。您可以在 case 中使用正则表达式,而不是在很多 case 中使用。
      • 嗨 @Mohammad Sadiq ,我只想知道为什么 assertionFailure 在 Xcode 默认项目设置的发布版本中运行。
      猜你喜欢
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      • 2018-03-12
      • 1970-01-01
      相关资源
      最近更新 更多