首先,add 超级简单,只需包含这个函数即可:
func +=(inout lhs: [SomeProtocol], rhs: SomeProtocol) {
lhs.append(rhs)
}
remove 比较棘手,因为SomeProtocol 可以同样适用于class 或struct,并且只有具有类类型的值才能与=== 进行比较。
我们可以改用== 运算符,但它只接受符合Equatable 协议的值,并且Equatable 只能用作通用 约束(到目前为止) , 否则你可以使用 protocol<SomeProtocol,Equatable> 之类的东西作为你的数组元素类型。
如果您确定您的SomeProtocol 将仅应用于类,请考虑重构您的代码以使用该类类型:
protocol SomeProtocol {}
class SomeClass : SomeProtocol {}
var list:[SomeClass] = []
func add(some:SomeClass) {
list += some
}
func remove(some:SomeClass) {
list -= some
}
func +=(inout lhs: [SomeClass], rhs: SomeClass) {
lhs.append(rhs)
}
func -=(inout lhs: [SomeClass], rhs: SomeClass) {
for (i,v) in enumerate(lhs) {
if v === rhs {
lhs.removeAtIndex(i)
break
}
}
}
如果你也让SomeClass符合Equatable,那么通常的数组函数会自动工作,你甚至不需要重载+=和-=。
否则,如果您不知道您的值是类还是结构体,最好考虑一下 SomeProtocol 的值“相等”意味着什么并需要比较方法:
protocol SomeProtocol {
func isEqualTo(some: SomeProtocol) -> Bool
}
func -=(inout lhs: [SomeProtocol], rhs: SomeProtocol) {
for (i,v) in enumerate(lhs) {
if v.isEqualTo(rhs) {
lhs.removeAtIndex(i)
break
}
}
}
// add functions work the same as above
或者,您可以使用您的原始代码并编写一个全局比较函数:
func ===(lhs: SomeProtocol, rhs: SomeProtocol) -> Bool {
// return something based on the properties of SomeProtocol
}