使用其他 class 个实例从 class 创建实例
Create instance from class using other class instance
所以我遇到了这种情况,一个已经发布的应用程序需要更改所有 API 和模型。
现在我已经创建了一个通用层来处理请求和 api,几乎在实现所有服务的过程中,现在我遇到了这个问题,之前定义的模型当然在应用程序中广泛使用,因为它MVC
,大型视图控制器。将每个场景中的所有内容都更改为新模型类型会让我付出太多代价,
因此,我想制作一个适配器,以便在我将新模型放入我的模型时进行转换
旧类型的回调闭包。
我已经找到了一种方法,但问题很长很长,我正在寻找一种更好的方法(如果存在的话),如果有更好的方法的话,我正在寻找一个更好的解决方案。
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()
,现在想象一下用 [=24= 实现一个模型]+50 变量和 +40 模型总共,可能需要一两岁。
我希望我理解了这个问题,这不是一个干净的解决方案,但它快速且灵活:
协议中的附加方法如何在其扩展中实现以执行所有复制?这是可能的,因为我看到所有属性都有一个分配的虚拟值。然后,对于每个实现 Parsable 的对象,唯一要做的就是在初始化器中调用这样的方法。一种 commonInit()
方法。
protocol Parsable {
var time: String { get }
var span: String { get }
init(_ copy: Parsable)
func initParsableProperties(from copy: Parsable)
}
extension Parsable {
func initParsableProperties(from copy: Parsable) {
self.span = copy.span
self.time = copy.time
}
}
class Foo: Parsable {
...
required init(_ copy: Parsable) {
initParsableProperties(from: copy)
}
...
}
如果需要,这还允许您在初始化程序中添加其他属性。如果你不需要额外的属性,那么它可以直接在初始化器中实现,但它需要一些更棘手的解决方案。
所以我使用 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
所以我遇到了这种情况,一个已经发布的应用程序需要更改所有 API 和模型。
现在我已经创建了一个通用层来处理请求和 api,几乎在实现所有服务的过程中,现在我遇到了这个问题,之前定义的模型当然在应用程序中广泛使用,因为它MVC
,大型视图控制器。将每个场景中的所有内容都更改为新模型类型会让我付出太多代价,
因此,我想制作一个适配器,以便在我将新模型放入我的模型时进行转换
旧类型的回调闭包。
我已经找到了一种方法,但问题很长很长,我正在寻找一种更好的方法(如果存在的话),如果有更好的方法的话,我正在寻找一个更好的解决方案。
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()
,现在想象一下用 [=24= 实现一个模型]+50 变量和 +40 模型总共,可能需要一两岁。
我希望我理解了这个问题,这不是一个干净的解决方案,但它快速且灵活:
协议中的附加方法如何在其扩展中实现以执行所有复制?这是可能的,因为我看到所有属性都有一个分配的虚拟值。然后,对于每个实现 Parsable 的对象,唯一要做的就是在初始化器中调用这样的方法。一种 commonInit()
方法。
protocol Parsable {
var time: String { get }
var span: String { get }
init(_ copy: Parsable)
func initParsableProperties(from copy: Parsable)
}
extension Parsable {
func initParsableProperties(from copy: Parsable) {
self.span = copy.span
self.time = copy.time
}
}
class Foo: Parsable {
...
required init(_ copy: Parsable) {
initParsableProperties(from: copy)
}
...
}
如果需要,这还允许您在初始化程序中添加其他属性。如果你不需要额外的属性,那么它可以直接在初始化器中实现,但它需要一些更棘手的解决方案。
所以我使用 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