【发布时间】: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 上发布了一个帖子,这似乎是一个编译器错误。
【问题讨论】: