swift - 比较符合协议的结构

Fra*_*lin 2 struct iequatable swift

我有以下表示点或线的结构:

public struct Point{
    let x : Double
    let y : Double

    init (x : Double, y : Double)
    {
        self.x = x
        self.y = y
    }
}
extension Point : Equatable{}
    public func ==(lhs: Point, rhs: Point) -> Bool
    {
        return lhs.x == rhs.x && lhs.y == rhs.y
    }
Run Code Online (Sandbox Code Playgroud)

public struct Line {
    let points : [Point]
    init(points : [Point])
    {
        self.points = points
    }
}

extension Line : Equatable {}
    public func ==(lhs: Line, rhs: Line) -> Bool
    {
        return lhs.points == rhs.points
    }
Run Code Online (Sandbox Code Playgroud)

我希望能够有一个 Shape 协议或结构,我可以用它来拥有点和线,然后我可以在它们之间进行比较。我尝试使用符合协议 Shape 来做到这一点,但是当我想将一个点与一条线进行比较时,即使它们是 Shape,Swift 编译器也会给我一个错误。

我必须从结构转移到类吗?
我想我可能不得不使用泛型,但不知道如何解决这个问题。在此先感谢您的任何指导。

编辑1:

我对 Shape 协议的方法实际上只是尝试一些东西,但没有任何效果。我尝试了以下方法:

protocol MapShape : Equatable
{
      func == (lhs: MapShape, rhs: MapShape ) -> Bool
}
Run Code Online (Sandbox Code Playgroud)

根据建议,我还更改了行的 Equatable 扩展的代码

Mar*_*n R 5

这个主题在 WWDC 2015 会议视频Swift 中面向协议的编程中有所涉及,这是我尝试将其应用于您的情况:

您定义一个协议Shape和一个协议扩展方法 isEqualTo:

protocol Shape {
    func isEqualTo(other: Shape) -> Bool
}

extension Shape where Self : Equatable {
    func isEqualTo(other: Shape) -> Bool {
    if let o = other as? Self { return self == o }
    return false
    }
}
Run Code Online (Sandbox Code Playgroud)

isEqualTo:检查另一个元素是否属于相同类型(并==在这种情况下将它们与它们进行比较),false如果它们属于不同类型则返回。

Equatable自动符合的所有类型Shape,这样我们就可以设置

extension Point : Shape { }
extension Line : Shape { }
Run Code Online (Sandbox Code Playgroud)

(当然,您可以添加其他Shape所有形状类型都应该实现的方法。)

现在我们可以将==形状定义为

func ==(lhs: Shape, rhs: Shape) -> Bool {
        return lhs.isEqualTo(rhs)
}
Run Code Online (Sandbox Code Playgroud)

瞧,点和线可以比较:

let p1 = Point(x: 1, y: 2)
let p2 = Point(x: 1, y: 3)
let l1 = Line(points: [p1, p2])
let l2 = Line(points: [p1, p2])

print(p1 == p2) // false
print(p1 == l1) // false
print(l1 == l2) // true
Run Code Online (Sandbox Code Playgroud)

备注:您现在已经有了==forShape类型,但我还没有弄清楚如何使Shape符合Equatable. 也许其他人可以解决那部分问题(如果可能的话)。