标签: codable

如何将(Swift4)init添加到Decodable协议

我正在尝试创建一个Codable扩展,它能够仅使用json字符串初始化Decodable(Swift 4)对象.那应该是什么工作:

struct MyObject: Decodable {
   var title: String?
}

let myObject = MyObject(json: "{\"title\":\"The title\"}")
Run Code Online (Sandbox Code Playgroud)

我认为这意味着我应该创建一个使用Decoder调用self.init的init.这是我提出的代码:

public init?(json: String) throws {
    guard let decoder: Decoder = GetDecoder.decode(json: json)?.decoder else { return }
    try self.init(from: decoder) // Who what should we do to get it so that we can call this?
}
Run Code Online (Sandbox Code Playgroud)

该代码能够获取解码器,但是在调用init时出现编译器错误.我得到的错误是:

在self.init电话之前使用'self'

这是否意味着无法在Decodable协议中添加init?

有关完整的源代码,请参阅github上的可编码扩展

更新: 从@appzYourLive调试下面的解决方案后,我发现我与init(json:Decodable和Array上的初始化程序有冲突.我刚刚向GitHub发布了新版本的扩展.我还添加了解决方案作为这个问题的新答案.

json init swift4 codable decodable

3
推荐指数
1
解决办法
3054
查看次数

可解码的多个DateDecodingStrategies

是否有可能将多个添加JSONDecoder.DateDecodingStrategy到同一个JSONDecoder

我有一个可解码的:

struct Movie: Decodable {
    enum CodingKeys: String, CodingKey {
        case title = "display_title"
        case mpaaRating = "mpaa_rating"
        case criticsPick = "critics_pick"
        case byline
        case headline
        case summaryShort = "summary_short"
        case publicationDate = "publication_date"
        case openingDate = "opening_date"
        case dateUpdated = "date_updated"
        case link
        case multimedia
    }

let title: String
let mpaaRating: String
let criticsPick: Int
let byline: String
let headline: String
let summaryShort: String
let publicationDate: Date
let openingDate: Date?
let updatedDate: Date
let …
Run Code Online (Sandbox Code Playgroud)

json ios swift swift4 codable

3
推荐指数
1
解决办法
1177
查看次数

如何使用 Swift 4 编码键处理来自 json 响应的动态键

在我的应用程序中,我得到这样的响应我将如何处理这种响应,它在每个数据数组中都有动态键

{
    "code": 200,
    "message": "Top Likers info.",
    "error": null,
    "data": {
        "manishamohapatra11": {
            "id": "5591322611",
            "username": "manishamohapatra11",
            "full_name": ":-)Sunshine :-)",
            "profile_pic_url": "https://scontent-atl3-1.cdninstagram.com/vp/d2ba431ac70ec067d5d6def73a721250/5B553C8E/t51.2885-19/s150x150/27877706_168319037141873_8387886458379173888_n.jpg",
            "followed_by_viewer": true,
            "requested_by_viewer": false,
            "likeCount": 7
        },
        "chrysxnthemxm": {
            "id": "5658970660",
            "username": "chrysxnthemxm",
            "full_name": "Quotes and Sayings",
            "profile_pic_url": "https://scontent-atl3-1.cdninstagram.com/vp/f1fb37c94c181d49d9997e24b5d70068/5B40EF01/t51.2885-19/s150x150/20478547_331538517270771_7021810425566068736_a.jpg",
            "followed_by_viewer": true,
            "requested_by_viewer": false,
            "likeCount": 4
        }
     }
   }
Run Code Online (Sandbox Code Playgroud)

我已经创建了结构响应

swift4 codable

3
推荐指数
1
解决办法
2402
查看次数

JSONEncoder不允许将类型编码为原始值

我正在Codableenum具有可能关联值的类型的实现工作.由于这些对于每种情况都是独一无二的,我认为在编码过程中我可以在没有键的情况下输出它们,然后简单地看一下我在解码时可以得到什么来恢复正确的情况.

这是一个非常简洁,人为的例子,演示了一种动态类型的值:

enum MyValueError : Error { case invalidEncoding }

enum MyValue {
    case bool(Bool)
    case float(Float)
    case integer(Int)
    case string(String)
}

extension MyValue : Codable {
    init(from theDecoder:Decoder) throws {
        let theEncodedValue = try theDecoder.singleValueContainer()

        if let theValue = try? theEncodedValue.decode(Bool.self) {
            self = .bool(theValue)
        } else if let theValue = try? theEncodedValue.decode(Float.self) {
            self = .float(theValue)
        } else if let theValue = try? theEncodedValue.decode(Int.self) {
            self = .integer(theValue)
        } else if let theValue = …
Run Code Online (Sandbox Code Playgroud)

swift codable

3
推荐指数
1
解决办法
2718
查看次数

协议扩展的可编码(或可编码)不符合它

我有2个协议,Filters并且Parameters都扩展了Encodable

protocol Filters: Encodable {
    var page: Int { get }
}

protocol Parameters: Encodable {
    var type: String { get }
    var filters: Filters { get }
}
Run Code Online (Sandbox Code Playgroud)

因此,我创建了符合这些协议的结构。

struct BankAccountFilters: Filters {
    var page: Int
    var isWithdrawal: Bool
}

struct BankAccountParamters: Parameters {
    let type: String = "Bank"
    var filters: Filters
}

let baf = BankAccountFilters(page: 1, isWithdrawal: true)
let bap = BankAccountParamters(filters: baf)
Run Code Online (Sandbox Code Playgroud)

失败是因为…

错误:类型“ BankAccountParamters”不符合协议“可编码”

注意:无法自动合成“可编码”,因为“过滤器”不符合“可编码”

Filters显然确实符合Encodable …

swift swift-protocols codable

3
推荐指数
1
解决办法
3185
查看次数

使用 Swift 将可编码结构保存到 UserDefaults

我正在尝试对结构进行编码

struct Configuration : Encodable, Decodable {
    private enum CodingKeys : String, CodingKey {
        case title = "title"
        case contents = "contents"
    }
    var title : String?
    var contents: [[Int]]?
}
Run Code Online (Sandbox Code Playgroud)

转换成 JSON 以存储在 UserDefaults.standard 的本地键中。我有以下代码:

let jsonString = Configuration(title: nameField.text, contents: newContents)
let info = ["row" as String: jsonString as Configuration]
print("jsonString = \(jsonString)")
//trying to save object
let defaults = UserDefaults.standard
let recode = try! JSONEncoder().encode(jsonString)
defaults.set(recode, forKey: "simulationConfiguration")
//end of saving local
Run Code Online (Sandbox Code Playgroud)

打印返回:

jsonString = Configuration(title: Optional("config"), …
Run Code Online (Sandbox Code Playgroud)

swift userdefaults codable

3
推荐指数
1
解决办法
6557
查看次数

使用可选类型时的 RealmSwift 和 Codable

RealmSwift在一个项目中使用和 Codable 已经很长时间了,但是,我的 api 开发人员只给了我两个仅存在于对象的某些返回调用中的新属性。如果我打电话getUserInfo,我会收到一个user model没有这两个属性的。在这种情况下,您将在 codable 中使用 decodeIfPresent 并将数据类型设置为可选。然而,这两个字段是纪元时间值,使它们成为某种数字。Realm 要求您的数据类型以@objc.

@objc dynamic var scanIn:Double = 0
Run Code Online (Sandbox Code Playgroud)

当然,所有数字原语都是这样工作的,但NONE其中的一些是作为可选项工作的。您必须使用NSNumber或类似的方式来使用可选项ObjC,但幸运的是,Codable它不适用于NSNumber. 我知道我在这里有很多不同的选择,但我真的在寻找一些简单快捷的东西,不需要我用映射重建整个模型或在我收到它时转换所有东西。我现在会写出一个解决方法,但我真的想让事情保持简单和干净。

如果没有返回,我尝试设置一个值,并且只使用像这样的非可选类型

scanIn = try container.decodeIfPresent(Double.self, forKey:.scanIn) ?? 0
Run Code Online (Sandbox Code Playgroud)

但是,出于某种原因,这会将所有值设置为 0。我不知道它为什么这样做,但另一位开发人员建议它不能在这样的可编码中工作,我不得不将 double 设置为可选。我想澄清一下,这个数字在转换之前就存在,但之后是 0。

关于简单修复的任何想法?也许我做错了什么?

realm swift swift3 codable

3
推荐指数
1
解决办法
1738
查看次数

如何忽略可编码中的 nil json 值

我目前收到了收据Auto-RenewableNon-Renewable。但是Non-Renewable没有返回expires_datejson 密钥。我怎么能忽略这一点。我试图避免做expires_date一个可选的。当我将其设为可选时,Apple 会返回响应。有没有办法可以在不进行expires_date可选的情况下解码 json 。

struct Receipt: Codable {

    let expiresDate: String

    private enum CodingKeys: String, CodingKey {
        case expiresDate = "expires_date"
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我可以得到

“没有与键 CodingKeys(stringValue: \"expires_date\", intValue: nil) (\"expires_date\") 关联的值。”

json ios swift codable

3
推荐指数
1
解决办法
957
查看次数

为 ARAnchor 实现 Codable:“不能在扩展中自动合成......”

该代码extension ARAnchor: Codable {}产生错误:

“无法在与类型不同的文件中的扩展名中自动合成‘Decodable’的实现”。

这是什么意思?我能够以Codable类似的方式为另一种本机类型实现而没有任何错误。

augmented-reality swift arkit codable

3
推荐指数
2
解决办法
3542
查看次数

Swift 可编码、可解码与可编码

在 Apple doc 中发现,该Codable协议由Encodable和组成Decodable。因此,

Codable = Encodable & Decodable
Run Code Online (Sandbox Code Playgroud)

现在,假设我在下面的类中实现,

class X: Codable {
    var name: String
}

class Y: Encodable, Decodable {
    var name: String
}

class Z: Encodable & Decodable {
    var name: String
}
Run Code Online (Sandbox Code Playgroud)

那么,类XY和之间是否存在功能差异Z

如果没有尊重为什么我们不能&在 的地方使用,

composition swift codable decodable encodable

3
推荐指数
2
解决办法
1771
查看次数