swift - 复制构造函数和“无法调用非函数类型的值”错误
问题描述
我有一个基类 A 和三个子类:
class A {}
class X : A {}
class Y : A {}
class Z : A {}
在我的代码中,我有一个实例m
,我想创建一个相同类型的副本。我可以成功使用以下代码:
let n = type(of: m).init(m)
... and in class A:
required init(m : A) {
self.param1 = m.param1
我尝试通过在 A 类中创建一个复制构造函数来简化事情:
func copy() {
return type(of: self).init(self)
}
但此声明会产生错误:无法调用非函数类型“AType”的值
两个问题:我做错了什么?是否有更简单的方法来创建涉及子类的复制构造函数?
解决方案
尝试原型设计模式:
public protocol Copying: class {
init(_ prototype: Self)
}
extension Copying {
public func copy() -> Self {
return type(of: self).init(self)
}
}
public class A: Copying {
public var value1: Int
public var value2: Int
public init(value1: Int, value2: Int) {
self.value1 = value1
self.value2 = value2
}
public required convenience init(_ a: A) {
self.init(value1: a.value1, value2: a.value2)
}
}
你可以像这样使用它:
let a = A(value1: 700, value2: 37)
let aCopy = a.copy()
推荐阅读
- node.js - 节点在 dockerized 节点应用程序中找不到 node_modules
- python - 子图 x 次数取决于数组的长度
- python - 未找到参数 '('',)' 的 'quiz_change' 反向。尝试了 1 种模式:['suppliers/quiz/(?P
[0-9]+)/$'] - java - 将 UTC 日期转换为不同时区的日期
- pandas - 如何按 ID 和时间段对日期时间数据进行分组?
- c# - 点击AdaptiveAction后,如何再次启用
- solr - 需要在集群模式下连接solr和认证
- angular - Angular 7 中没有名称错误的表单控件的值访问器
- c++ - 多线程中的同步
- javascript - 如何动态地将路由添加到 React 应用程序?