我有一个实现Swift 4的结构Codable
。是否有一种简单的内置方法将该结构编码为字典?
let struct = Foo(a: 1, b: 2)
let dict = something(struct)
// now dict is ["a": 1, "b": 2]
如果您不介意数据移位,可以使用以下方法:
extension Encodable {
func asDictionary() throws -> [String: Any] {
let data = try JSONEncoder().encode(self)
guard let dictionary = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: Any] else {
throw NSError()
}
return dictionary
}
}
或可选变体
extension Encodable {
var dictionary: [String: Any]? {
guard let data = try? JSONEncoder().encode(self) else { return nil }
return (try? JSONSerialization.jsonObject(with: data, options: .allowFragments)).flatMap { $0 as? [String: Any] }
}
}
假设Foo
符合Codable
或确实Encodable
可以做到这一点。
let struct = Foo(a: 1, b: 2)
let dict = try struct.asDictionary()
let optionalDict = struct.dictionary
问题内容: 我在解码JSON结构时遇到问题,我无法对其进行更改以使其更易于解码(它来自firebase)。 如何将以下JSON解码为对象?问题是如何转换“ 7E7-M001”。这是带有抽屉的容器的名称。抽屉名称也用作键。 我必须在Container&Drawer类中解决哪些问题,才能将键作为title属性和这些类中的对象数组? 问题答案: 首先,我将略作简化,以便我可以集中讨论此问题的重点。我将使
问题内容: 我正在使用带有JSON数据的Swift 4 协议。我的数据经过格式化,以使得在根级别只有一个键,并且包含一个包含我所需属性的对象值,例如: 我有一个可以解密密钥的结构: 由于和是的属性,而不是根目录级别,因此我需要制作一个包装器类型,如下所示: 然后,我可以通过解码JSON ,也可以解码。似乎有很多冗余代码,因为我在每种类型上都需要一个额外的包装。有没有办法避免这种包装模式,或更正确/
问题内容: 我设法同时使用JSON和plist编码和解码,但是只能通过直接在特定对象上调用encoding / decode函数来实现。 例如: 这很好,没有问题。 但是,我试图获得一个仅接受协议一致性作为类型并保存该对象的函数。 这将导致以下错误: 无法使用类型为“(可编码)”的参数列表调用“编码” 看一下encoding函数的定义,似乎它应该能够接受,除非是我不知道的某种奇怪的类型。 问题答案
问题内容: 我尝试解析返回json对象的api。我的问题是,在以下示例中,某些键有时是字符串,有时是类似“ Value”键的对象: 我的结构看起来像这样: 我必须告诉我我完全迷路了(是的,我是个迅速的初学者),我找不到解决我问题的方法。我知道我必须使用自定义init,但我不知道如何。 问题答案: 你可以试试
我正在试着做一个简单的咖啡计算器。我需要显示以克为单位的咖啡量。克的“G”符号需要附加到我用来显示数量的UILabel上。UILabel中的数字随着用户输入而动态变化很好,但我需要在字符串末尾添加一个小写“G”,它的格式与更新数字的格式不同。“G”需要附加在数字上,以便随着数字大小和位置的改变,“G”会随着数字“移动”。我肯定这个问题以前已经解决了,所以一个正确方向的链接将是有帮助的,因为我已经谷
问题内容: 寻找一些有关如何处理我最近遇到的情况的意见。 我一直在使用Swift 4s Codable取得成功,但今天发现了我没有想到的崩溃。我正在使用的API说,它为key 返回a 。 我的存根结构如下: 效果很好,问题在于API 有时会 返回a 而不是a 。 因此,我的解码失败并显示: 该字符串只能等于,我希望它等于。 我也可以将结构更改为是否可以简化从API导入JSON数据的过程。但是,当然