仅适用于数值类型的泛型类型约束
Posted
技术标签:
【中文标题】仅适用于数值类型的泛型类型约束【英文标题】:Generic type constraint for numerical type only 【发布时间】:2014-06-06 02:15:13 【问题描述】:我试图弄清楚如何为泛型类(在 Swift 中)实现类型约束,它将泛型类型限制为仅限数字类型。例如 Double、Int 等,但不是字符串。感谢您的帮助。
【问题讨论】:
【参考方案1】:您可以使用尖括号为泛型类(同样的语法适用于函数)指定类型约束(使用类和协议):
class Foo<T: Equatable, U: Comparable>
要对一种类型指定多个要求,请使用where
子句:
class Foo<T: UIViewController where T: UITableViewDataSource, T: UITextFieldDelegate>
但是,您似乎无法在通用参数子句中指定可选要求,因此一种可能的解决方案是创建一个所有数字类型都通过扩展实现的协议,然后将您的类限制在该要求上:
protocol Numeric
extension Float: Numeric
extension Double: Numeric
extension Int: Numeric
class NumberCruncher<C1: Numeric>
func echo(num: C1)-> C1
return num
NumberCruncher<Int>().echo(42)
NumberCruncher<Float>().echo(3.14)
【讨论】:
我认为它可能必须是这样的,但我只是希望已经内置了一些东西。不过实现起来并不难。谢谢。 泛型提供了承诺,但是将泛型用于数值算法有很多陷阱。提供对类型零的公共访问的体操(他们不认为包含所有数字类型的 zero() 类函数)只是您可能遇到的问题之一。整数和浮点数之间的架构差异排除了许多数值算法的通用编程。【参考方案2】:Strideable
是每个标准数字类型都符合的最小标准协议,但它也有更多的类型符合它。
http://swiftdoc.org/protocol/Strideable/hierarchy/
或者你可以使用IntegerType
和FloatingPointType
。
【讨论】:
或者现在在 Swift 3 中——Integer
而不是 IntegerType
【参考方案3】:
正如谈到的here 和here,Numeric
协议现在是 Swift 4 的一部分,因此 - 例如 - 你可以为数字元组重载 +
,如下所示:
func +<T : Numeric> (x: (T, T), y: (T, T)) -> (T, T)
return (x.0 + y.0, x.1 + y.1)
(1,1) + (2,3) // (3, 4) : (Int, Int)
(1.25, 1.5) + (2.5, 2.25) // (3.75, 3.75) : (Double, Double)
【讨论】:
以上是关于仅适用于数值类型的泛型类型约束的主要内容,如果未能解决你的问题,请参考以下文章