【发布时间】:2016-02-12 21:06:57
【问题描述】:
假设我有一个班级编号:
class Number {
var val: Double?
}
并且有该类的两个实例,A 和 B。
现在想象一下我想通过这样的语句将B合并到A
merge(B, into: A)
现在我当然可以这样写函数:
func merge(from: Number, into: Number){
into.val = from.val
}
但这根本不能重复使用。有没有办法可以编写一个通用的合并类?
更新:尽管一些答案提供了良好且可行的解决方案,但它们都不够“通用”(这里的通用是指非技术性的) .所以看答案,我得到了一些启发,这是我现在正在考虑的解决方案:将 Number 设为 NSObject 子类,并将所有可以合并的属性声明为动态。例如:
class Number: NSObject {
//Put the required init and initWithCoder: here
dynamic var val: Double?
}
然后声明可合并类必须遵守的协议
protocol Mergeable: class {
var mergeablePropertyKeys:[String] {get}
}
然后声明一个执行合并的全局函数:
func merge<U: Mergeable, Mergeable where U.Type == V.Type>(from: U, into:V){
for property in U.mergeablePropertyKeys {
V.setValue(U.valueForKey(property), property)
}
}
而且我知道这行不通,因为要合并的参数不一定是NSObjects。
- 如何确保
merge的参数都是NSObjects? - 是否可以通过简单地获取对象的动态值列表来避免指定所有可合并值的名称?
【问题讨论】:
-
泛型合并类是什么意思?全局通用合并功能?定义通用合并函数的协议?
-
要么,要么,它可以通过我认为的协议来实现,我不太确定如何。
-
你说的是映射吗?
-
在 Swift 中使用
NSObject确实意味着走错了方向。 -
@appzYourLife 我也有这种感觉,但我们看得更清楚吗?如果我们有良好的 ol' c 指针,这将非常容易。