【问题标题】:Generic type constraint for numerical type only仅适用于数值类型的泛型类型约束
【发布时间】:2014-06-06 02:15:13
【问题描述】:

我试图弄清楚如何为泛型类(在 Swift 中)实现类型约束,它将泛型类型限制为仅限数字类型。例如 Double、Int 等,但不是字符串。感谢您的帮助。

【问题讨论】:

    标签: ios generics swift


    【解决方案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】:

    正如谈到的herehereNumeric 协议现在是 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      • 2022-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多