标签: codable

成功地使Enum(具有关联类型)可编码

我无法正确解码我的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)

swift codable

8
推荐指数
1
解决办法
738
查看次数

如何在使用Realm时实现Codable

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)

realm ios alamofire swift4 codable

8
推荐指数
2
解决办法
1043
查看次数

Swift Codable协议...编码/解码NSCoding类

我有以下结构......

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)

nscoding swift swift4 codable

7
推荐指数
1
解决办法
2307
查看次数

使用Swift 4嵌套的Codable协议

我正在使用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但我无法使其工作.

我的问题:这是一个编译器错误(它仍然是测试版)或者我做错了什么?

swift4 xcode9 codable

7
推荐指数
1
解决办法
1785
查看次数

Swift 4使用Codable解码json

有人能告诉我我做错了什么吗?我在这里查看了所有问题,如下所示如何使用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)

swift4 codable

7
推荐指数
1
解决办法
3402
查看次数

如何解码类型依赖于标记的值数组?

我有一个带有一组值的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)

json swift codable

7
推荐指数
2
解决办法
734
查看次数

Swift Codable 将空 json 解码为 nil 或空对象

这是我的代码:

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 设为非可选并且它只有默认值?我知道我可以为此创建一个自定义解析器,但我有大量这样的请求,它需要太多的额外工作。

ios swift codable decodable

7
推荐指数
2
解决办法
2万
查看次数

Swift 4 Decodable:来自嵌套数组的struct

鉴于以下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对象nodesactors属性中的嵌套容器中检索.

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 swift codable decodable

7
推荐指数
1
解决办法
2301
查看次数

Swift Codable null处理

我有一个使用解析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 的值.

json ios swift codable decodable

7
推荐指数
2
解决办法
9776
查看次数

NSKeyedArchiver不归档我的Codable类

这是我的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)

nskeyedarchiver ios swift4 codable

7
推荐指数
2
解决办法
2824
查看次数

标签 统计

codable ×10

swift ×6

swift4 ×5

ios ×4

decodable ×3

json ×3

alamofire ×1

nscoding ×1

nskeyedarchiver ×1

realm ×1

xcode9 ×1