我正在尝试创建一个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?
更新:
从@appzYourLive调试下面的解决方案后,我发现我与init(json:Decodable和Array上的初始化程序有冲突.我刚刚向GitHub发布了新版本的扩展.我还添加了解决方案作为这个问题的新答案.
是否有可能将多个添加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) 在我的应用程序中,我得到这样的响应我将如何处理这种响应,它在每个数据数组中都有动态键
{
"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)
我已经创建了结构响应
我正在Codable为enum具有可能关联值的类型的实现工作.由于这些对于每种情况都是独一无二的,我认为在编码过程中我可以在没有键的情况下输出它们,然后简单地看一下我在解码时可以得到什么来恢复正确的情况.
这是一个非常简洁,人为的例子,演示了一种动态类型的值:
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) 我有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 …
我正在尝试对结构进行编码
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) 我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。
关于简单修复的任何想法?也许我做错了什么?
我目前收到了收据Auto-Renewable和Non-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\") 关联的值。”
该代码extension ARAnchor: Codable {}产生错误:
“无法在与类型不同的文件中的扩展名中自动合成‘Decodable’的实现”。
这是什么意思?我能够以Codable类似的方式为另一种本机类型实现而没有任何错误。
在 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)
那么,类X、Y和之间是否存在功能差异Z?
如果没有尊重为什么我们不能&在 的地方使用,?