仅适用于数字类型的通用类型约束

时间:2014-06-06 02:15:13

标签: ios generics swift

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

3 个答案:

答案 0 :(得分:28)

您可以使用尖括号为泛型类(相同的语法适用于函数)指定类型约束(使用类和协议):

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)

答案 1 :(得分:12)

Strideable是每个标准数字类型符合的最小标准协议,但它还有一些符合它的类型。 http://swiftdoc.org/protocol/Strideable/hierarchy/

或者您可以使用IntegerTypeFloatingPointType

答案 2 :(得分:0)

正如herehere所述,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)