首页 > 解决方案 > Swift:发布版本中断言失败的奇怪行为

问题描述

在我看来,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而不是第一个引起。

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

编辑于 2018-11-29

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

标签: iosswift

解决方案


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


推荐阅读