展开 Optional 值时意外发现 nil

Posted

技术标签:

【中文标题】展开 Optional 值时意外发现 nil【英文标题】:Unexpectedly found nil when unwrapping an Optional value 【发布时间】:2018-03-19 21:07:35 【问题描述】:

我正在执行以下代码:

let createByDicc = [
        "nickname" : self.createdBy?.nickname,
        "avatar" : self.createdBy?.avatar,
        "id" : self.createdBy?.id
        ] as! [String : String]

    let dicc = [
        "channelId" : self.channelId!,
        "createBy" : createByDicc,
        "message" : self.message!,
        "type" : "message",
        "replyTo" : "nmartello"
        ] as! [String : String]

我很肯定我使用的所有变量都不为空(self.createdBy?.nickname 等已分配了一个字符串)。如果我注释掉

"createBy" : createByDicc'

它工作得很好,但如果不是我得到 Unexpectedly found nil when unwrapping an Optional value 。我需要在 Dictionary 中使用此 Dictionary 来获取我需要使用 Alamofire 调用的 WS 的有效负载,但我不确定这里有什么问题。有什么想法吗?

【问题讨论】:

还...dicc 应该是 [String:Any],因为您正在其中加载字典 检查createByDicc的定义,因为它没有被赋值 self.createdBy(尤其是id)的所有属性都包含字符串吗?看起来 createByDicc 无法转换为 [String: String] 类型。 What does "fatal error: unexpectedly found nil while unwrapping an Optional value" mean?的可能重复 从不(强制)将字典转换为特定类型。注释类型let dicc : [String : String] = [ ... 然后你会得到一个编译器错误,这会导致你遇到问题 【参考方案1】:

首先,你说 dicc 是一个 [String: String] 字典,但你的 createByDicc 不是一个字符串,它是另一个字典。所以你的 dicc 应该是 [String: Any]。

其次,永远不要强行打开选项是一个很好的做法。尝试执行 if letguard 语句并保存值或仅使用 Nil Coalescing:self.message ?? ""

【讨论】:

以上是关于展开 Optional 值时意外发现 nil的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中播放音乐:在展开 Optional 值时意外发现 nil

Swift 致命错误:在 segue 上展开 Optional 值时意外发现 nil

在NSCoder中展开Optional值时,意外地发现了nil

iOS/Xcode:Koloda 框架:在隐式展开 Optional 值时意外发现 nil

Book (Swift for Dummies) 第 4 章练习:致命错误:在展开 Optional 值时意外发现 nil

为啥我在尝试在 iOS Swift 中向服务器发出 post 请求时收到此错误:在展开 Optional 值时意外发现 nil?