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
而不是第一个引起。
另一个奇怪的事情是,如果我在 function 中删除任何两个case
(至少两个case
)init?(rawValue: String)
, assertionFailure 将被忽略,不会有任何崩溃。PS,我没有禁用发布版本的优化。
编辑于 2018-11-29
我在Apple Developer Forum上发布了一个帖子,这似乎是一个编译器错误。
解决方案
我在Apple Developer Forum上发布了一个帖子,这似乎是一个编译器错误。
推荐阅读
- azure - Azure ARM - 更新管理 - 虚拟机载入
- generics - 具有流类型的 JS - 将泛型从柯里化函数的外部传递到内部范围
- angular - 未调用 Angular 属性装饰器函数
- .net-core - 与 CORS 相关的错误 - 没有访问控制允许来源
- javascript - js函数不适用于node和browserify
- python - 为什么文件内容只打印一次
- ios - IOS 上的 FCM 推送通知错误 InvalidRegistration 和 NotRegistered
- javascript - 将时间戳转换为 Firestore 中的可读日期
- java - 如何运行 patternview 两次以使用线程更改密码?
- javascript - 在 HTML 中显示按数组名称分组的 JSON 结果数组