我认为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上发布了一个线程,它看起来像是编译器错误。
答案 0 :(得分:2)
根据文档
在-O构建中(Xcode的Release配置的默认设置),停止 程序执行。
在-Ounchecked构建中,优化器可能会假定此功能为 从来没有打电话。
所以它在版本build.i.e中的行为正确停止执行。
答案 1 :(得分:0)
我在Apple Developer Forum上发布了一个线程,它看起来像是编译器错误。