作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有这个协议(protocol):
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)扩展到其他类型。如果我理解正确的话,我不会将泛型与协议(protocol)一起使用,而是使用关联类型:
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)
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'
有没有可能做到这一点?
最佳答案
您可以创建第二个协议(protocol)并在您想要的类型上实现它:
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)
}
这样一来,您的协议(protocol)就要求该类型始终可以自行添加。
关于swift - 协议(protocol)泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27448661/
我是一名优秀的程序员,十分优秀!