标签: codable

如何将 CodingKeys 用于符合 Codable 协议的枚举?

我有一个符合协议EmailVerificationStatus的关联类型的枚举:StringCodable

enum EmailVerificationStatus: String, Codable {
    case unverified
    case verified
}
Run Code Online (Sandbox Code Playgroud)

我正在使用的网络服务以大写 ( UNVERIFIED/ VERIFIED)发送这些案例。我如何使用CodingKeys枚举来映射这种差异?类似以下内容不起作用:

enum CodingKeys: String, CodingKey {
    case unverified = "UNVERIFIED"
    case verified = "VERIFIED"
}
Run Code Online (Sandbox Code Playgroud)

enums ios swift4 codable

5
推荐指数
1
解决办法
1660
查看次数

获取 KeyPath 的特定 CodingKey

考虑以下对象:

struct User: Codable {
    let id: Int
    let email: String
    let name: String
}
Run Code Online (Sandbox Code Playgroud)

是否有可能获得CodingKey给定的特定信息KeyPath

let key = \User.name.codingKey  // would be equal to string: "name"
Run Code Online (Sandbox Code Playgroud)

key-value-coding ios swift swift4 codable

5
推荐指数
1
解决办法
1827
查看次数

如何使用可编码和文件管理器在 swift 4 中保存数据

大家好,那里的每个人都知道如何在 swift 4 中保存数据我制作了一个表情符号应用程序,我可以描述表情符号并且我有一个未来可以在应用程序中保存新的表情符号我在我的表情符号类中编写了这段代码,但正如我想要返回表情符号我收到错误请帮助我。

import Foundation

struct Emoji : Codable {
    var symbol : String
    var name : String
    var description : String
    var usage : String
    static let documentsdirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
    static let archiveurl = documentsdirectory.appendingPathComponent("emojis").appendingPathExtension("plist")

    static func SaveToFile (emojis: [Emoji]) {
        let propetyencod = PropertyListEncoder()
        let encodemoj = try? propetyencod.encode(emojis)
        try? encodemoj?.write(to : archiveurl , options : .noFileProtection)
    }
    static func loadeFromFile () -> [Emoji] {
    let propetydicod = PropertyListDecoder()
        if let retrivdate = try? …
Run Code Online (Sandbox Code Playgroud)

swift4 codable

5
推荐指数
1
解决办法
1818
查看次数

将未知的 Encodable 枚举值解码为默认值

我必须像这样反序列化一个 JSON 字符串:

{ "name" : "John Smith", "value" : "someValue" }
Run Code Online (Sandbox Code Playgroud)

在 Swift 4 中,“value”应该是一个枚举,整个对象是一个结构体,如下所示:

struct MyType {
    name: String?
    value: Value?
}
Run Code Online (Sandbox Code Playgroud)

在未来的某个时候,后端可能会添加新的枚举值,所以我认为进行一些回退是明智的。

我以为我可以创建一个枚举

enum Value {
    case someValue
    case someOtherValue
    case unknown(value: String)
}
Run Code Online (Sandbox Code Playgroud)

但我无法解决如何反序列化该枚举并使其工作。以前我只是使用String枚举,但反序列化未知值会引发错误。

是否有一种简单的方法可以使其工作,或者我应该将值反序列化为 aString并在结构中创建一个自定义 getter 并使用 switch 语句返回其中一种情况(甚至可能不是在结构本身中,而是在我的视图模型中)?

enums json deserialization swift codable

5
推荐指数
1
解决办法
1152
查看次数

如何使用 Decodable 解码 JSON 数组?

我请求 API 向我发送一些数据,我可以成功检索这些数据,但我仍停留在它的解码过程中。这是我收到的 JSON:

[  
   {  
      "challenge_id":1,
      "challenge_title":"newchallenge1",
      "challenge_pts_earned":1000,
      "challenge_description":"description1",
      "start_date":"2017-09-24T00:00:00.000Z",
      "end_date":"2017-09-24T00:00:00.000Z",
      "challenge_category_id":1,
      "status_id":2,
      "createdAt":"2017-09-24T17:21:47.000Z",
      "updatedAt":"2017-09-24T09:40:34.000Z"
   },
   {  
      "challenge_id":2,
      "challenge_title":"challenge1",
      "challenge_pts_earned":100,
      "challenge_description":"description1",
      "start_date":"2017-09-24T00:00:00.000Z",
      "end_date":"2017-09-24T00:00:00.000Z",
      "challenge_category_id":1,
      "status_id":0,
      "createdAt":"2017-09-24T17:22:12.000Z",
      "updatedAt":"2017-09-24T09:22:12.000Z"
   },
   {  
      "challenge_id":3,
      "challenge_title":"new eat title",
      "challenge_pts_earned":600000,
      "challenge_description":"haha",
      "start_date":"2017-01-09T00:00:00.000Z",
      "end_date":"2017-01-10T00:00:00.000Z",
      "challenge_category_id":2,
      "status_id":0,
      "createdAt":"2017-09-27T17:12:10.000Z",
      "updatedAt":"2017-09-27T09:15:19.000Z"
   }
]
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建以下结构来对其进行解码:

   struct challenge : Codable {
    let  id : String?
    let  title : String?
    let  pointsEarned : String?
    let  description : String?
    let  dayStarted : String?
    let  dayEnded : String?
    let  categoryID : String?
    let  statusID …
Run Code Online (Sandbox Code Playgroud)

json swift codable

5
推荐指数
1
解决办法
6415
查看次数

Swift 4 JSON 值为空

我在优雅地处理这个错误时遇到了问题debugDescription: "Expected String value but found null instead." 我知道在我的结构中符合Codable,我的存储属性需要声明为可选字符串,正如我在这篇文章中读到

我试过了,仍然出现错误。我还在那篇文章中读到,我还可以自定义解码器以将 nil 替换为空字符串。我不知道如何做到这一点。

这是我的代码:

struct Discover: Codable {
    var page: Int
    var totalResults: Int
    var totalPages: Int
    var results: [DiscoverResults]

     enum CodingKeys: String, CodingKey {
        case page
        case totalResults = "total_results"
        case totalPages = "total_pages"
        case results = "results"
    }

}

struct DiscoverResults {
    var title: String
    var releaseDate: String
    var posterPath: String?
    var id: Int
    var genreIds: [Int]
    var poster: UIImage?

     enum CodingKeys: String, …
Run Code Online (Sandbox Code Playgroud)

json ios swift4 codable decodable

5
推荐指数
0
解决办法
3107
查看次数

NSCoding 和 Codable 可以共存吗?

在测试新的 Codable 如何与 NSCoding 交互时,我使用包含 Codable 结构的 Class 进行了涉及 NSCoding 的操场测试。丝毫

struct Unward: Codable {
    var id: Int
    var job: String
}

class Akward: NSObject, NSCoding {

    var name: String
    var more: Unward

    init(name: String, more: Unward) {
        self.name = name
        self.more = more
    }

    func encode(with aCoder: NSCoder) {
        aCoder.encode(name, forKey: "name")
        aCoder.encode(more, forKey: "more")
    }

    required init?(coder aDecoder: NSCoder) {
        name = aDecoder.decodeObject(forKey: "name") as? String ?? ""
        more = aDecoder.decodeObject(forKey: "more") as? Unward ?? Unward(id: -1, job: …
Run Code Online (Sandbox Code Playgroud)

nscoding swift swift4 codable

5
推荐指数
2
解决办法
3372
查看次数

Codable 类中的 Codable 变量

鉴于这个类:

class MyClass: Codable {
    var variable : Codable? = nil
}
Run Code Online (Sandbox Code Playgroud)

我得到错误:

类型“MyClass”不符合协议“Decodable”

类型“MyClass”不符合协议“Encodable”

如何将符合 Codable 的通用变量作为 Codable 类中的属性?

swift codable

5
推荐指数
1
解决办法
1135
查看次数

Swift Codable 嵌套 json 作为字符串

我用于后端调用的服务返回所有这些 json 结构:

{
    "status" : "OK",
    "payload" : **something**
}
Run Code Online (Sandbox Code Playgroud)

哪里的东西可以是一个简单的字符串:

{
    "status" : "OK",
    "payload" : "nothing changed"
}
Run Code Online (Sandbox Code Playgroud)

或嵌套的 json(具有任何属性的任何 json),例如:

{
    "status" : "OK",
    "payload" : {
                    "someInt" : 2,
                    "someString" : "hi",
                    ...
                }
}
Run Code Online (Sandbox Code Playgroud)

这是我的结构:

struct GenericResponseModel: Codable {

    let status:String?
    let payload:String?
}
Run Code Online (Sandbox Code Playgroud)

我想始终将“有效负载”解码为字符串。因此,在第二种情况下,我希望“GenericResponseModel”的有效负载属性包含该字段的 json 字符串,但是如果我尝试解码该响应,则会收到错误消息:

Type 'String' mismatch: Expected to decode String but found a dictionary instead
Run Code Online (Sandbox Code Playgroud)

可以存档我想要的吗?

非常感谢

json swift swift4 codable

5
推荐指数
1
解决办法
1604
查看次数

在 Swift 中合并可编码

我有以下 Swift 结构

struct Session: Encodable {
    let sessionId: String
}
struct Person: Encodable {
    let name: String
    let age: Int
}

let person = Person(name: "Jan", age: 36)
let session = Session(sessionId: "xyz")
Run Code Online (Sandbox Code Playgroud)

我需要编码为具有以下格式的 json 对象:

{
  "name": "Jan",
  "age": 36,
  "sessionId": "xyz"
}
Run Code Online (Sandbox Code Playgroud)

的所有键Session都合并到Person

我想过使用带有自定义Encodable实现的容器结构,我使用 aSingleValueEncodingContainer但它显然只能编码一个值

struct RequestModel: Encodable {
    let session: Session
    let person: Person

    public func encode(to encoder: Encoder) throws {
        var container = encoder.singleValueContainer()
        try container.encode(person)
        // crash …
Run Code Online (Sandbox Code Playgroud)

swift codable

5
推荐指数
2
解决办法
1091
查看次数