gpt4 book ai didi

swift - 协议(protocol)泛型

转载 作者:可可西里 更新时间:2023-11-01 00:17:26 25 4
gpt4 key购买 nike

我有这个协议(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com