协议的泛型

时间:2014-12-12 17:11:45

标签: swift

我有这个协议:

protocol Addable
{
    mutating func addNumber(value: Int)
}

和此扩展程序

extension Int : Addable
{
    mutating func addNumber(value: Int)
    {
        self = self + value
    }
}

此代码:

    var number : Int = 10
    number.addNumber(10)
    println(number)

正确打印20

现在我想将协议Addable扩展到其他类型。如果我理解正确,我不会在协议中使用泛型,但我使用相关类型:

protocol Addable
{
    typealias AddableType
    mutating func addNumber(value: AddableType)
}

现在,AddableType表示泛型类型,我可以扩展为例如Float

extension Float : Addable
{
    mutating func addNumber(value: Float)
    {
        self = self + value
    }
}

    var another : Float = 10.5
    another.addNumber(10.1)
    println(another)

这打印20.6

现在,我知道我可以强制执行相关类型以符合协议

protocol Addable
{
    typealias AddableType : AProtocol, AnotherProtocol // ...
    mutating func addNumber(value: AddableType)
}

但是,这就是问题所在,我无法强制执行类型或某些类型的符合性

protocol Addable
{
    typealias AddableType : Int, Float
    mutating func addNumber(value: AddableType)
}

Error: Inheritance from non-protocol, non-class type 'Int'
Error: Inheritance from non-protocol, non-class type 'Float'

有可能这样做吗?

3 个答案:

答案 0 :(得分:3)

您可以创建第二个协议并在您想要的类型上实现该协议:

protocol AddableRequirement {}

extension Int: AddableRequirement {}
extension Float: AddableRequirement {}

protocol Addable {
    typealias AddableType: AddableRequirement
    mutating func addNumber(value: AddableType)
}

您可能还想使用Self而不是类型:

protocol Addable {
    mutating func addNumber(value: Self)
}

这样,您的协议要求该类型始终可以自行添加。

答案 1 :(得分:2)

您可以定义新协议并声明要允许的类型的一致性。

protocol AllowedAddableType {}

extension Int: AllowedAddableType {}
extension Float: AllowedAddableType {}
// ...

protocol Addable
{
    typealias AddableType: AllowedAddableType
    mutating func addNumber(value: AddableType)
}

答案 2 :(得分:2)

类型可以符合协议,协议可以符合协议,但协议不符合类型。使协议符合类型在语言的语法定义中没有任何意义。

我猜你的意图是限制允许符合此协议的对象类型。在这种情况下,您可以从类型中定义继承的协议,然后让您的协议符合该协议。

protocol TypeRestrictor {}

extension Int: TypeRestrictor {}
extension Float: TypeRestrictor {}

protocol Addable {
    typealias AddableType: TypeRestrictor
    mutating func addNumber(value: AddableType)
}
相关问题