Swift协议专门用于通用协议

时间:2017-09-14 16:31:14

标签: swift generics inheritance protocols specialization

是否可以拥有专门用于通用协议的协议?我想要这样的东西:

protocol Protocol: RawRepresentable {
  typealias RawValue = Int
  ...
}

这会编译,但当我尝试从协议实例访问initrawValue时,其类型为RawValue而不是Int

1 个答案:

答案 0 :(得分:2)

在Swift 4中,您可以为协议添加约束:

protocol MyProtocol: RawRepresentable where RawValue == Int {
}

现在,MyProtocol上定义的所有方法都将具有Int rawValue。例如:

extension MyProtocol {
    var asInt: Int {
        return rawValue
    }
}

enum Number: Int, MyProtocol {
    case zero
    case one
    case two
}

print(Number.one.asInt)
// prints 1

采用RawRepresentable但其RawValue不是Int的类型不能采用您的约束协议:

enum Names: String {
    case arthur
    case barbara
    case craig
}

// Compiler error
extension Names : MyProtocol { }