我有一个符合协议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) 考虑以下对象:
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) 大家好,那里的每个人都知道如何在 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) 我必须像这样反序列化一个 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 语句返回其中一种情况(甚至可能不是在结构本身中,而是在我的视图模型中)?
我请求 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) 我在优雅地处理这个错误时遇到了问题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) 在测试新的 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) 鉴于这个类:
class MyClass: Codable {
var variable : Codable? = nil
}
Run Code Online (Sandbox Code Playgroud)
我得到错误:
类型“MyClass”不符合协议“Decodable”
类型“MyClass”不符合协议“Encodable”
如何将符合 Codable 的通用变量作为 Codable 类中的属性?
我用于后端调用的服务返回所有这些 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)
可以存档我想要的吗?
非常感谢
我有以下 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)