swift - 使用其他类实例从类创建实例
问题描述
所以我遇到了这种情况,一个已经发布的应用程序需要更改它的所有API 和模型。
现在我已经创建了一个通用层来处理请求和 api,并且几乎是在实现所有服务的中途,现在我遇到了这个问题,当然,之前定义的模型在应用程序中被广泛使用,因为它MVC
是Massive View Controller。将每个场景中的所有内容更改为新模型类型会花费我太多的成本,
因此我想制作一个适配器来将新模型转换为我的回调闭包中的旧模型类型。
我已经找到了一种方法,但是问题很长,我正在寻找一种更好的方法(如果存在),并且如果有更好的方法,则可以为整个案例寻找更好的解决方案。
protocol Parsable {
var time: String { get }
var span: String { get }
init(_ copy: Parsable)
}
class Foo: Parsable {
required init(_ copy: Parsable) {
self.span = copy.span
self.time = copy.time
}
init(time: String, span: String) {
self.time = time
self.span = span
}
var time = ""
var span = ""
}
class Fee: Parsable {
required init(_ copy: Parsable) {
self.span = copy.span
self.time = copy.time
}
init(time: String, span: String, date: String) {
self.time = time
self.span = span
self.date = date // an extra var that is not used in Foo
}
var time = ""
var span = ""
var date = ""
}
var foo = Foo(time: "", span: "")
var fee = Fee(time: "2", span: "ye", date: "123")
// Usage
var deeped = Foo(fee)
正如您从代码中可以看出的那样,我创建了一个protocol
包含变量和一个init()
保存其类型的代码,现在想象这要实现一个具有+50变量和+40模型的模型,可能需要一两个年龄。
解决方案
所以我实现了这个使用Codable
,我创建了一个符合的虚拟协议,Codable
并在每个我需要转换它的地方使用它,并创建了一个从该协议扩展的通用函数,将对象编码为数据,然后将其解码为所需的新类型,class
struct
这样我就不必声明我需要手动复制的任何变量或属性。
查看下面的代码。
protocol Convertable: Codable {}
class Foo: Convertable {
var foo: String
var fee: String
init(foo: String, fee: String) {
self.foo = foo
self.fee = fee
}
}
class Fee: Convertable{
var fee: String
init( fee: String) {
self.fee = fee
}
}
//Generic function to convert
extension Convertable {
func convert<T: Codable>(_ primary: T.Type) -> T? {
return try? JSONDecoder().decode(primary, from: try! JSONEncoder().encode(self))
}
}
var foo = Foo(foo: "nothing", fee: "nothing")
let fee = foo.convert(Fee.self)
fee?.fee // nothing
推荐阅读
- javascript - Paper.js 中动态生成的可移动矢量形状
- php - 具有复杂符号的环境变量
- android - 如何模仿选择器活动/共享菜单?
- c# - 将光标隐藏在一定时间内不动并在移动时再次显示
- django - nginx 没有从上游 gunicorn 返回 Cache-Control 标头
- ios - Swift 中的货币格式
- spring - 具有依赖项的 Spring-Data-JPA 原子插入
- wpf - WPF - Catel - 为不同线程中的窗口禁用 CommandManager
- javascript - 修改正则表达式以禁止空格
- python - Class function returning 'None'