仅用于数字types的genericstypes约束

我想弄清楚如何实现genericstypes(在Swift中)的types约束,将genericstypes仅限于数字types。 比如Double,Int等,而不是string。 谢谢你的帮助。

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

class Foo<T: Equatable, U: Comparable> { } 

要在单个types上指定多个需求,请使用where子句:

 class Foo<T: UIViewController where T: UITableViewDataSource, T: UITextFieldDelegate> { } 

然而,看起来你不能在通用的参数子句中指定可选的需求,所以一个可能的解决scheme是创build一个协议,所有的数字types都通过扩展实现,然后根据这个需求约束你的类:

 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) 

Strideable是每个标准数字types所遵循的最小的标准协议,但是它也有一些符合它的types。 http://swiftdoc.org/protocol/Strideable/hierarchy/

或者你可以使用IntegerTypeFloatingPointType

您可以使用枚举来自定义:

 enum Numeric { case NInt(Int) case NUInt(UInt) case NFloat(Float) case NDouble(Double) } 

然后在你的代码中使用它:

 func myFunc(x: Numeric) -> Numeric { switch x { case let NInt(i): return i + 1 case let NUInt(u): return u + 1 case let NFloat(f): return f + 1 case let NDouble(d): return d + 1 } } 

或者,您可以使用NSNumber,它将多个数字types汇总成一个覆盖types。