我有三个不同的类A
,B
和C
以及一些公共属性。例如,所有这些都具有名为index
的属性。所有这些都继承自其他类X
,它没有属性index
,我无法修改这些类(它来自框架)。现在我想创建这些类之一的实例化并设置index
属性。我现在怎么做:
func returnPreparedObjet() -> X? {
if some_condition1 {
let a = A()
a.index = 1
return a
}
else if some_condition2 {
let b = B()
b.index = 1
return b
}
else if some_condition3 {
let c = C()
c.index = 1
return c
}
return nil
}
在没有重复.index = 1
和return
行的情况下实现它的最佳选择是什么?我可以在A
,B
,C
不从X
继承的情况下实现这一目标吗?
答案 0 :(得分:1)
您可以使用通用协议对这三个类进行分组:
protocol Indexed {
var index: Int { get set }
}
,并为这三个类添加一致性
extension A: Indexed {}
extension B: Indexed {}
extension C: Indexed {}
扩展中不需要代码,因为类已经声明了可写的index
属性。
然后,您可以将returnPreparedObject
简化为以下内容:
func returnPreparedObject() -> X? {
let result: (X & Indexed)?
if some_condition1 {
result = A()
} else if some_condition2 {
result = B()
} else if some_condition3 {
result = C()
}
result?.index = 1
return result
}