Swift: Protocol 'Set' 只能用作泛型约束,因为它有 Self 或关联类型要求

Swift: Protocol 'Set' can only be used as a generic constraint because it has Self or associated type requirements

因此,我尝试在 Swift 上实现一个 Set ADT 版本作为实践,当我尝试实现 Set 接口(或 swift 中的协议)时,我得到了以下错误:"Protocol 'Set' can only be used as a generic constraint because it has Self or associated type requirements"。这是我到目前为止编码的内容:

public protocol Set{
    associatedtype E

    func add(elm : E)
    func remove(elm : E) -> Bool
    func clear()
    func isMember(elm : E) -> Bool
    func size() -> Int
    func isEmpty() -> Int
    func isSubset(S2 : Set) -> Bool
    func union(S2 : Set) -> Set?
    func intersection(S2 : Set) -> Set?
    func difference(S2 : Set) -> Set?
}

你可以定义一些类似Set的协议如下:

public protocol MySet{
    associatedtype Element

    func add(elm : Element)
    func remove(elm : Element) -> Bool
    func clear()
    func isMember(elm : Element) -> Bool
    func size() -> Int
    func isEmpty() -> Int
    func isSubset(S2 : Self) -> Bool
    func union(S2 : Self) -> Self?
    func intersection(S2 : Self) -> Self?
    func difference(S2 : Self) -> Self?
}

但我不确定它是否像您期望的那样像 ADT 一样工作。 正如您收到的错误消息一样,在 Swift 中,具有关联类型(或具有 Self)的协议 只能用作通用约束 .

Swift 协议在某些情况下可能不像 interface 在某些其他面向对象语言中那样工作。

你说这个作为练习,那么这可以成为学习Swift协议如何工作的好练习。