斯威夫特:断言的怪异行为发布版本中失败

时间:2018-11-21 08:47:11

标签: ios 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引起,而不是第一个。

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

于2018-11-29编辑

我在Apple Developer Forum上发布了一个线程,它看起来像是编译器错误。

2 个答案:

答案 0 :(得分:2)

根据文档

  

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

     

在-Ounchecked构建中,优化器可能会假定此功能为   从来没有打电话。

所以它在版本build.i.e中的行为正确停止执行。

答案 1 :(得分:0)

我在Apple Developer Forum上发布了一个线程,它看起来像是编译器错误。