在我看来,assertionFailure
将在发布版本中被忽略。但是当我在 Release模式下运行下面的代码时,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)
,assertionFailure会被忽略,不会有任何crash。
PS,我不会禁用发布版本的优化。
2018-11-29编辑
我在 Apple Developer Forum 上发布了一个话题,这似乎是一个编译器错误。
最佳答案
我在 Apple Developer Forum 上发布了一个话题,这似乎是一个编译器错误。
关于ios - Swift:发布版本中 assertionFailure 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53408214/