我无法正确解码我的Codable类型.我已经阅读了一些关于Codable使用相关类型制作枚举的教程.我搜索过拼写错误,名称不匹配,或者其他什么,但我无法发现任何错误.然而,每当我尝试对这些结构进行解码时(一个图层...这在扩展中的一个图层上定义了一个"属性"......但是图层的所有其他预定义部分都被正确地加/解码),我点击了方法中的"未找到密钥"异常decode(from decoder:).
extension Layer {
struct Attribute: Codable {
enum Value: Codable {
case pulse(Double)
case flash(Double)
case draw(Double)
private enum CodingKeys: String, CodingKey {
case pulse, flash, draw
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
switch self {
case .pulse(let value):
try container.encode(value, forKey: .pulse)
case .flash(let value):
try container.encode(value, forKey: .flash)
case .draw(let value):
try container.encode(value, forKey: .draw)
}
}
init(from decoder: Decoder) throws {
let values = try …Run Code Online (Sandbox Code Playgroud) Hy我正在研究使用Realm和Alamofire的应用程序.我很高兴在我的iOS项目中使用这些库.
但后来我必须发布一个包含多个模型列表的模型列表.所以这是太深的东西,我的意思是List里面的List包含模型,那些模型包含几个模型的列表
为了演示,我们举一个我的模型的例子
@objcMembers public class MyModel : Object{
dynamic var Id: String = ""
dynamic var Name: String = ""
dynamic var Favorites: List<String>? = nil
dynamic var Subjects: List<UserSubject>? = nil
}
@objcMembers public class UserSubject: Object{
dynamic var Id: String = ""
dynamic var Name: String = ""
dynamic var Teachers: List<Publications>? = nil
}
@objcMembers public class Publications: Object{
dynamic var Id: String = ""
dynamic var Name: String = ""
dynamic var Editors: List<Editors>? = …Run Code Online (Sandbox Code Playgroud) 我有以下结构......
struct Photo: Codable {
let hasShadow: Bool
let image: UIImage?
enum CodingKeys: String, CodingKey {
case `self`, hasShadow, image
}
init(hasShadow: Bool, image: UIImage?) {
self.hasShadow = hasShadow
self.image = image
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
hasShadow = try container.decode(Bool.self, forKey: .hasShadow)
// This fails
image = try container.decode(UIImage?.self, forKey: .image)
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(hasShadow, forKey: .hasShadow)
// This also fails
try …Run Code Online (Sandbox Code Playgroud) 我正在使用Swift 4和Codable一点点,并且遇到了一些具有嵌套协议的场景,这些协议都符合Codable.
简化示例如下所示:
protocol CodableSomething: Codable {}
protocol CodableAnotherThing: Codable {
var something: CodableSomething { get }
}
struct Model: CodableAnotherThing {
var something: CodableSomething
}
Run Code Online (Sandbox Code Playgroud)
此代码使用Xcode 9 Beta 5进行构建错误:
现在,我没想到这些错误,因为我理解编译器会自动生成对这些协议的一致性,实际上,我甚至无法在没有构建错误的情况下手动实现此一致性.我也尝试了几种不同的方法来解决这种嵌套模型结构的使用,Codable但我无法使其工作.
我的问题:这是一个编译器错误(它仍然是测试版)或者我做错了什么?
有人能告诉我我做错了什么吗?我在这里查看了所有问题,如下所示如何使用Swift Decodable协议解码嵌套的JSON结构?我发现了一个看起来正是我需要的Swift 4 Codable解码json.
{
"success": true,
"message": "got the locations!",
"data": {
"LocationList": [
{
"LocID": 1,
"LocName": "Downtown"
},
{
"LocID": 2,
"LocName": "Uptown"
},
{
"LocID": 3,
"LocName": "Midtown"
}
]
}
}
struct Location: Codable {
var data: [LocationList]
}
struct LocationList: Codable {
var LocID: Int!
var LocName: String!
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let url = URL(string: "/getlocationlist")
let task = URLSession.shared.dataTask(with: url!) { data, …Run Code Online (Sandbox Code Playgroud) 我有一个带有一组值的JSON:
[
{ "tag": "Foo", … },
{ "tag": "Bar", … },
{ "tag": "Baz", … },
]
Run Code Online (Sandbox Code Playgroud)
我想将这个数组解码为一个structs 数组,其中特定类型取决于标记:
protocol SomeCommonType {}
struct Foo: Decodable, SomeCommonType { … }
struct Bar: Decodable, SomeCommonType { … }
struct Baz: Decodable, SomeCommonType { … }
let values = try JSONDecoder().decode([SomeCommonType].self, from: …)
Run Code Online (Sandbox Code Playgroud)
我怎么做?目前我有这个有点丑陋的包装:
struct DecodingWrapper: Decodable {
let value: SomeCommonType
public init(from decoder: Decoder) throws {
let c = try decoder.singleValueContainer()
if let decoded = try? c.decode(Foo.self) {
value …Run Code Online (Sandbox Code Playgroud) 这是我的代码:
class LoginUserResponse : Codable {
var result: String = ""
var data: LoginUserResponseData?
var mess: [String] = []
}
public class LoginUserResponseData : Codable {
var userId = "0"
var name = ""
}
Run Code Online (Sandbox Code Playgroud)
现在,调用服务器 API 我正在解析这样的响应(使用 Stuff 库来简化解析):
do {
let loginUserResponse = try LoginUserResponse(json: string)
} catch let error {
print(error)
}
Run Code Online (Sandbox Code Playgroud)
当我输入正确的密码时,我会得到这样的答案:
{"result":"success","data":{"userId":"10","name":"Foo"},"mess":["You're logged in"]}
Run Code Online (Sandbox Code Playgroud)
这很好,解析器工作正常。
提供错误密码时给出以下答案:
{"result":"error","data":{},"mess":["Wrong password"]}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,解析器失败了。它应该将数据设置为 nil,而是尝试将其解码为 LoginUserResponseData 对象。
我在使用改造的 Android 上使用相同的方法,它工作正常。我宁愿不想将所有字段都设为可选。
有没有办法让解析器将空的 json {} 视为 nil?或者将 LoginUserResponseData 设为非可选并且它只有默认值?我知道我可以为此创建一个自定义解析器,但我有大量这样的请求,它需要太多的额外工作。
鉴于以下JSON文档,我想创建一个struct包含四个属性:filmCount(Int),year(Int),category(String)和actor(Actor数组).
{
"filmCount": 5,
"year": 2018,
"category": "Other",
"actors":{
"nodes":[
{
"actor":{
"id":0,
"name":"Daniel Craig"
}
},
{
"actor":{
"id":1,
"name":"Naomie Harris"
}
},
{
"actor":{
"id":2,
"name":"Rowan Atkinson"
}
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
PlacerholderData是一个存储三个主要属性和actor列表的结构,这些属性应该从JSON对象nodes的actors属性中的嵌套容器中检索.
PlacerholderData:
struct PlaceholderData: Codable {
let filmCount: Int
let year: Int
let category: String
let actors: [Actor]
}
Run Code Online (Sandbox Code Playgroud)
Actor.swift:
struct Actor: Codable {
let id: Int
let name: String
} …Run Code Online (Sandbox Code Playgroud) 我有一个使用解析JSON的结构Codable.
struct Student: Codable {
let name: String?
let amount: Double?
let adress: String?
}
Run Code Online (Sandbox Code Playgroud)
现在,如果金额值为空,则JSON解析失败.
那么我应该手动处理结构中存在的所有Int和空的情况吗?DoubleStudent
将String自动处理作为null 的值.
这是我的Codable类:
class SensorOutput: Codable {
var timeStamp: Date?
var gyroX: Double?
var gyroY: Double?
var gyroZ: Double?
var accX: Double?
var accY: Double?
var accZ: Double?
var magX: Double?
var magY: Double?
var magZ: Double?
init() {}
}
Run Code Online (Sandbox Code Playgroud)
在这里,我尝试编写并读取该类的对象以进行归档:
let myData = SensorOutput()
myData.timeStamp = Date()
myData.gyroX = 0.0
myData.gyroY = 0.0
myData.gyroZ = 0.0
myData.accX = 0.0
myData.accY = 0.0
myData.accZ = 0.0
myData.magX = 0.0
myData.magY = 0.0
myData.magZ = 0.0
NSKeyedArchiver.archiveRootObject(myData, toFile: filePath)
if let Data = …Run Code Online (Sandbox Code Playgroud)