gpt4 book ai didi

swift - 使 Swift 协议(protocol)在关联类型上符合 Equatable

转载 作者:行者123 更新时间:2023-11-28 06:50:46 29 4
gpt4 key购买 nike

在 Swift 2.1(运行 XCode 7.2)中,我试图让关联类型符合 Equatable 的协议(protocol)。

// (#1)

/**
A Node in a graph
*/
public protocol GraphNode : Equatable {

typealias Content : Equatable

/**
The content of the node.
E.g. in a graph of strings, this is a string
*/
var content: Content {get}

/// The list of neighbours of this Node in the graph
var children: [Self] {get}
}

由于我们可以为关联类型定义不同类型的协议(protocol)的非同类实现,我预计我将无法在这里(在协议(protocol)级别,而不是在实现级别)定义一个等式功能:

// (#2)

/// Won't compile, as expected
public func ==(lhs: GraphNode, rhs: GraphNode) {
return lhs.content == rhs.content
}

这是因为我无法保证lhs.Contentrhs.Content 的类型相同。但是我希望我可以用一些通用约束来指定它,例如:

// (#3)

/// Won't compile, why?
public func ==<Node1 : GraphNode, Node2 : GraphNode where Node1.Content == Node2.Content>(lhs: Node1, rhs: Node2)
{
return lhs.content == rhs.content // ERROR: Binary operator '==' cannot be applied to two 'Node1.Content' operands
}

#3 中,我们知道 lhs 和 rhs 具有相同的类型,并且我们知道(从关联类型的规范为 Equatable)Content 是相等的。那为什么我不能比较它们呢?

最佳答案

添加 -> Bool。只是一条错误消息。有时跨多行编写函数声明并不能提高可读性。

public func ==<Node1 : GraphNode, Node2 : GraphNode where Node1.Content == Node2.Content>(lhs: Node1, rhs: Node2) -> Bool {

return (lhs.content == rhs.content)

}

关于swift - 使 Swift 协议(protocol)在关联类型上符合 Equatable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34975018/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com