Swift虚拟运营商?
假设我们有Foo类:Swift虚拟运营商?,swift,oop,Swift,Oop,假设我们有Foo类: class Foo { // some variables } func ==(left: Foo, right: Foo) -> Bool { return left.X == right.X && left.Y == right.Y && etc. } 对于类Foo,我们有==运算符: class Foo { // some variables } func ==(left: Foo, right: F
class Foo {
// some variables
}
func ==(left: Foo, right: Foo) -> Bool {
return left.X == right.X && left.Y == right.Y && etc.
}
对于类Foo,我们有==运算符:
class Foo {
// some variables
}
func ==(left: Foo, right: Foo) -> Bool {
return left.X == right.X && left.Y == right.Y && etc.
}
然后我们想在一些通用函数中使用它
class func mergeUnique<T: Equatable>(workaround: T) -> ((data: [T], newData: [T]) -> [T]) {
return { (data: [T], newData: [T]) in
var res = data
for newElem in newData {
var duplicate = false
for oldElem in res {
if oldElem == newElem {
duplicate = true
break
}
}
if !duplicate {
res.append(newElem)
}
}
return res
}
}
class func mergeUnique(解决方法:T)->(数据:[T],新数据:[T])->[T]){
在中返回{(数据:[T],新数据:[T])
var res=数据
对于newData中的newElem{
变量重复=错误
对于res中的oldElem{
如果oldElem==newElem{
重复=真
打破
}
}
如果!重复{
res.append(newElem)
}
}
返回res
}
}
问题是==运算符实际上是一个全局作用域函数,而不是类方法(我们可以在C++中这样做),因此当函数接收可等式对象时,它使用可等式协议的==运算符,而不是Foo类的==运算符。在这种情况下,我需要类似虚拟行为的东西。有什么想法吗?明确地将您的类定义为
equalable
extension Foo: Equatable {}
func ==(left: Foo, right: Foo) -> Bool {
return awesomeEquatableLogic
}
您应该使您的类符合Equalable协议:
class Foo: Equatable {
...
}
如果不这样做,程序将不知道如何检查相等性,它将使用默认实现。
一旦你这样做了,它将使用custom==操作符。你有没有试着让你的类可以equalable:class Foo:equalable?太好了。只需要在操作员实施之前添加
public
,现在一切都很好。我的行为不是很清楚(与C++相比)。感谢我所理解的,你可以认为SWIFT默认有虚拟方法。<>代码> C++ >代码>的特殊性是它总是试图执行静态调度(在编译时完成,因此需要标记为“代码>代码> />代码>”,其中大多数其他面向对象语言在运行时都使用消息传递。是的,C++思想是“无开销”,因此默认方法是非虚的,但标记为虚拟的方法。与Java或C#中的方法完全相同。我不清楚的是swift中的==函数不是方法(我的意思是不是成员函数)。但事实上,它演示了虚拟行为,工作原理与方法类似。