仅适用于数值类型的泛型类型约束

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/

或者你可以使用IntegerTypeFloatingPointType

【讨论】:

或者现在在 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)

【讨论】:

以上是关于仅适用于数值类型的泛型类型约束的主要内容,如果未能解决你的问题,请参考以下文章

Java的泛型约束和限制

关于TS的泛型

是否存在将我的泛型方法限制为数字类型的约束?

泛型编程类型约束与软件扩展性--面向可扩展的泛型编程就是面相类型约束编程

typescript :具有原始类型约束的泛型类型

泛型编程的术语