在 RxSwift 中使用 swift 4 可解码协议
Using swift 4 Decodable protocol with RxSwift
我最近尝试使用 Decodable 协议将 JSON 解析为一个模型,我已经成功地做到了。但是现在我想使用 RxSwift 实现双向绑定。为此,我需要声明 'Variable<>' 类型的变量。这是我模型中的一个片段:
struct Person : Decodable
{
var batchcomplete = String()
var `continue` = Continue()
var query = Query()
var limits = Limit()
enum CodingKeys: String,CodingKey
{
case batchcomplete
case `continue`
case limits
case query
}
init(from decoder: Decoder) throws
{
let container = try decoder.container(keyedBy: CodingKeys.self)
batchcomplete = try container.decode(String.self, forKey: .batchcomplete)
`continue` = try container.decode(Continue.self, forKey: .`continue`)
limits = try container.decode(Limit.self, forKey: .limits)
query = try container.decode(Query.self, forKey: .query)
}
}
现在,如果我将 'batchcomplete' 从 String() 更改为 Variable,init() 方法会抛出错误:
No 'decode' candidates produce the expected contextual result type 'Variable<String>'.
进行这些更改,您将收到错误消息。
var batchcomplete = Variable<String>("")
batchcomplete = try container.decode(Variable<String>.self, forKey: .batchcomplete)
不要尝试解码为 Variable
...只需设置其值:
batchcomplete.value = try container.decode(String.self, forKey: .batchcomplete)
或者你也可以声明你的实例变量并在你的 init 中初始化它一次:
let batchcomplete: Variable<String>
batchcomplete = Variable<String>(try container.decode(String.self, forKey: .batchcomplete))
附带说明一下,您的 Variable
应该声明为常量 (let),因为您更改了 Variable
.
中包含的值
我最近尝试使用 Decodable 协议将 JSON 解析为一个模型,我已经成功地做到了。但是现在我想使用 RxSwift 实现双向绑定。为此,我需要声明 'Variable<>' 类型的变量。这是我模型中的一个片段:
struct Person : Decodable
{
var batchcomplete = String()
var `continue` = Continue()
var query = Query()
var limits = Limit()
enum CodingKeys: String,CodingKey
{
case batchcomplete
case `continue`
case limits
case query
}
init(from decoder: Decoder) throws
{
let container = try decoder.container(keyedBy: CodingKeys.self)
batchcomplete = try container.decode(String.self, forKey: .batchcomplete)
`continue` = try container.decode(Continue.self, forKey: .`continue`)
limits = try container.decode(Limit.self, forKey: .limits)
query = try container.decode(Query.self, forKey: .query)
}
}
现在,如果我将 'batchcomplete' 从 String() 更改为 Variable,init() 方法会抛出错误:
No 'decode' candidates produce the expected contextual result type 'Variable<String>'.
进行这些更改,您将收到错误消息。
var batchcomplete = Variable<String>("")
batchcomplete = try container.decode(Variable<String>.self, forKey: .batchcomplete)
不要尝试解码为 Variable
...只需设置其值:
batchcomplete.value = try container.decode(String.self, forKey: .batchcomplete)
或者你也可以声明你的实例变量并在你的 init 中初始化它一次:
let batchcomplete: Variable<String>
batchcomplete = Variable<String>(try container.decode(String.self, forKey: .batchcomplete))
附带说明一下,您的 Variable
应该声明为常量 (let),因为您更改了 Variable
.