仅用于数字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/
或者你可以使用IntegerType
和FloatingPointType
。
您可以使用枚举来自定义:
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。