Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift虚拟运营商?_Swift_Oop - Fatal编程技术网

Swift虚拟运营商?

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

假设我们有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: 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中的==函数不是方法(我的意思是不是成员函数)。但事实上,它演示了虚拟行为,工作原理与方法类似。