我有这个协议:
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'
有可能这样做吗?
答案 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)
}