首页 > 解决方案 > 即使满足要求,可失败的初始化程序也总是返回 nil

问题描述

如果有以下代码,应该将[String: any]文档从 Firestore 转换为结构。

当我当时调试时,所有要求都得到满足,但返回值为nil.

我尝试将 更改为init?常规initelse { 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
        }
    }

标签: iosswift

解决方案


如果可失败初始化程序返回 nil 并且正常初始化程序由于错误数据而崩溃,那么这将我指向可失败初始化程序中的保护语句失败导致它返回 nil。在保护语句中的 return nil 行上放置一个断点,看看它是否被命中。


推荐阅读