ios - 即使满足要求,可失败的初始化程序也总是返回 nil
问题描述
如果有以下代码,应该将[String: any]
文档从 Firestore 转换为结构。
当我当时调试时,所有要求都得到满足,但返回值为nil
.
我尝试将 更改为init?
常规init
和else { fatalError() }
. guard
如果数据有效,则此方法有效并返回有效结构。
我对失败的初始化程序做错了什么?
这不起作用(总是返回 nil,即使有有效数据):
struct Banner {
let destinationUrl: URL
let imageUrl: URL
let endTime: Date
let startTime: Date
let priority: Int
let trackingKeyClicked: String
let trackingKeyDismissed: String
init?(document: [String: Any]) {
guard
let destinationUrlString = document["destinationUrl"] as? String,
let destinationUrl = URL(string: destinationUrlString),
let imageUrlString = document["imageUrl"] as? String,
let imageUrl = URL(string: imageUrlString),
let priority = document["priority"] as? Int,
let trackingKeyClicked = document["trackingKeyClicked"] as? String,
let trackingKeyDismissed = document["trackingKeyDismissed"] as? String,
let startTime = document["startTime"] as? Date,
let endTime = document["endTime"] as? Date
else { return nil }
self.destinationUrl = destinationUrl
self.imageUrl = imageUrl
self.priority = priority
self.trackingKeyClicked = trackingKeyClicked
self.trackingKeyDismissed = trackingKeyDismissed
self.endTime = endTime
self.startTime = startTime
}
}
// using it like this
let bannerStructs = querySnapshot.documents.map { Banner(document: $0.data()) }
这适用于有效数据(但在错误数据上崩溃而不是返回 nil):
struct Banner {
let destinationUrl: URL
// ...
let endTime: Date
init(document: [String: Any]) {
guard
let destinationUrlString = document["destinationUrl"] as? String,
let destinationUrl = URL(string: destinationUrlString),
// ....
let endTime = document["endTime"] as? Date
else { fatalError() }
self.destinationUrl = destinationUrl
// ...
self.endTime = endTime
}
}
解决方案
如果可失败初始化程序返回 nil 并且正常初始化程序由于错误数据而崩溃,那么这将我指向可失败初始化程序中的保护语句失败导致它返回 nil。在保护语句中的 return nil 行上放置一个断点,看看它是否被命中。
推荐阅读
- javascript - JS:如何通过某个键/属性合并/连接对象数组?
- php - 全局指定的自定义项目 Composer 供应商路径,但与全局供应商路径不同
- asp.net - 为什么 PartialView 方法总是返回空视图?
- latex - 在 Miktex 发行版中找不到 kpsewhich
- iis - 在根目录的子文件夹中发布 aspnetcore web api 时出现 IIS 502.5 错误
- objective-c - NSNumber 和 NSData
- serilog - Serilog忽略restrictedToMinimumlevel
- stan - What does the colon mean in Stan?
- python - Importing Pylot causes "invalid syntax" error in flask.py
- firefox - FireFox 62.0、46.0、47.0 等中的 RTCPeerConnection“未定义”