【问题标题】:How to create a protocol conform Comparable in Swift如何在 Swift 中创建一个符合 Comparable 的协议
【发布时间】:2021-05-27 01:10:35
【问题描述】:

我有一个用例来比较员工的等级。这是我想做的:

protocol Enployee: Comparable {
    var id: String { get }
    var rank: Int { get }
    var name: String { get }
    var type: String { get }
}

extension Enployee {
    static func <(lhs: Enployee, rhs: Enployee) -> Bool {
        return lhs.rank < rhs.rank
    }
}

但我收到以下错误:

Protocol 'Enployee' 只能用作通用约束,因为它具有 Self 或关联的类型要求

然后我更改了我的代码:

extension Enployee {
    static func <(lhs: Self, rhs: Self) -> Bool {
        return lhs.rank < rhs.rank
    }
}

我可以编译它。但是当我继续处理我的用户案例时:

struct Engineer: Enployee {
    var id: String
    var rank: Int
    var name: String
    let type: String = "Engineer"
}

struct Manager: Enployee {
    var id: String
    var rank: Int
    var name: String
    let type: String = "Manager"
}

let staff1 = Engineer(id: "123", rank: 2, name: "Joe")
let staff2 = Engineer(id: "124", rank: 2, name: "Frank")
let staff3 = Manager(id: "101", rank: 10, name: "John")

public struct Department<T: Comparable> {
}

let queue = Department<Enployee>()

我收到另一条错误消息:

Protocol 'Enployee' 作为一种类型不能符合 'Comparable'

有什么想法吗?

【问题讨论】:

  • "Employee" 是这个词的拼写方式。 ('m',而不是'n')
  • @Jessy 错字。谢谢。

标签: swift swift-protocols


【解决方案1】:

错误消息告诉您问题所在。声明 Department&lt;T: Comparable&gt; 后,您无法将 T 解析为 Enployee;它是一种协议,而不是符合 Comparable 的类型(如 Engineer)。

必须将泛型解析为 one 类型。如果这就是你真正的意思,那么声明 Department&lt;T: Enployee&gt; 是合法的。但是,您正在为多种部门类型设置自己,一个经理部门和一个工程师部门。这可能不是你想要的,所以这是对泛型的不好使用。

此外,类型字符串是一种可怕的难闻气味:

struct Engineer: Enployee {
    var id: String
    var rank: Int
    var name: String
    let type: String = "Engineer" // uck
}

您似乎更有可能在这里想要一个类和子类。为什么要对抗 OOP?

【讨论】:

  • 感谢您的 cmets。我可以在课堂上毫无问题地实现它。但我想以更面向协议的方式实现它。这才是我真正的意思。有不同的Employee(很抱歉我的原始帖子中的错字),例如ManagerEngineer。但我想比较一下他们的排名。
  • 您可以比较他们的排名,而无需让他们具有可比性。
  • 我知道如何与Comparable 进行比较,但我有一个现有的Queue 类,它需要Comparable 作为泛型类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2014-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多