There is a number of deficiencies with Swift and Numbers. Especially when

trying to be clever with generics.

- The API exposes built in types like`BuiltIn.Word` as the return type of

some APIs but there is no way to use said types.

- We have a Float and a Float80. Float and Doubles can't be initialised

(via init) with anything but Integer values but Float80 can be initialized

with both Floating Point and Integer

- We have a SignedNumberType but no UnsignedNumberType, All the floating

points use this protocol, so shouldn't this be NumberType ?

- SignedIntegerType and UnsignedIntegerType have a way of generically

constructing an Int as long as you cast it to the Maximum Int or UInt. But

there is no such thing for Floating Point Numbers.

- We have Float80 and a typealised Float32 and Float64. Why couldn't have

triple as an extra type name, as having one true type with a number is

confusing ?

- If all number types could be initilized with all number types, then a lot

of the constructors could be in the NumberType protocol.

Just in general it was hard to extend integers and floating point types.

For example in my code I wanted to pass a struct that contained a value to

any Floating Point or Integer and it would convert.

This is what I had to do, which is far too much and even sure I'm not

convinced it will work in every condition.

*protocol Box: CustomStringConvertible, CustomDebugStringConvertible {*

* typealias BoxType = Any*

* var value: BoxType { get set }*

* init()*

* init(_ value: BoxType)*

*}*

*protocol AngleType: Box {*

* typealias BoxType = Double*

*}*

*//Mark:- Box - FloatingPointType Conversion*

*extension SignedIntegerType {*

* init<T: Box where T.BoxType == Float80>(_ value: T) {*

* self.init(IntMax(value.value))*

* }*

* init<T: Box where T.BoxType == Double>(_ value: T) {*

* self.init(IntMax(value.value))*

* }*

* init<T: Box where T.BoxType == Float>(_ value: T) {*

* self.init(IntMax(value.value))*

* }*

* init<T: Box where T.BoxType == Int>(_ value: T) {*

* self.init(IntMax(value.value))*

* }*

* init<T: Box where T.BoxType == Int8>(_ value: T) {*

* self.init(IntMax(value.value))*

* }*

* init<T: Box where T.BoxType == Int16>(_ value: T) {*

* self.init(IntMax(value.value))*

* }*

* init<T: Box where T.BoxType == Int32>(_ value: T) {*

* self.init(IntMax(value.value))*

* }*

* init<T: Box where T.BoxType == Int64>(_ value: T) {*

* self.init(IntMax(value.value))*

* }*

* init<T: Box where T.BoxType == UInt>(_ value: T) {*

* self.init(IntMax(value.value))*

* }*

* init<T: Box where T.BoxType == UInt8>(_ value: T) {*

* self.init(IntMax(value.value))*

* }*

* init<T: Box where T.BoxType == UInt16>(_ value: T) {*

* self.init(IntMax(value.value))*

* }*

* init<T: Box where T.BoxType == UInt32>(_ value: T) {*

* self.init(IntMax(value.value))*

* }*

* init<T: Box where T.BoxType == UInt64>(_ value: T) {*

* self.init(IntMax(value.value))*

* }*

*}*

*extension UnsignedIntegerType {*

* init<T: Box where T.BoxType == Float80>(_ value: T) {*

* self.init(UIntMax(value.value))*

* }*

* init<T: Box where T.BoxType == Double>(_ value: T) {*

* self.init(UIntMax(value.value))*

* }*

* init<T: Box where T.BoxType == Float>(_ value: T) {*

* self.init(UIntMax(value.value))*

* }*

* init<T: Box where T.BoxType == Int>(_ value: T) {*

* self.init(UIntMax(value.value))*

* }*

* init<T: Box where T.BoxType == Int8>(_ value: T) {*

* self.init(UIntMax(value.value))*

* }*

* init<T: Box where T.BoxType == Int16>(_ value: T) {*

* self.init(UIntMax(value.value))*

* }*

* init<T: Box where T.BoxType == Int32>(_ value: T) {*

* self.init(UIntMax(value.value))*

* }*

* init<T: Box where T.BoxType == Int64>(_ value: T) {*

* self.init(UIntMax(value.value))*

* }*

* init<T: Box where T.BoxType == UInt>(_ value: T) {*

* self.init(UIntMax(value.value))*

* }*

* init<T: Box where T.BoxType == UInt8>(_ value: T) {*

* self.init(UIntMax(value.value))*

* }*

* init<T: Box where T.BoxType == UInt16>(_ value: T) {*

* self.init(UIntMax(value.value))*

* }*

* init<T: Box where T.BoxType == UInt32>(_ value: T) {*

* self.init(UIntMax(value.value))*

* }*

* init<T: Box where T.BoxType == UInt64>(_ value: T) {*

* self.init(UIntMax(value.value))*

* }*

*}*

*extension Float*

*{*

* init<T: Box where T.BoxType == Float>(_ value: T)*

* {*

* self.value = value.value.value*

* }*

*}*

*extension Double*

*{*

* init<T: Box where T.BoxType == Double>(_ value: T)*

* {*

* self.value = value.value.value*

* }*

*}*

*extension Float80*

*{*

* init<T: Box where T.BoxType == Float80>(_ value: T)*

* {*

* self.init(value.value)*

* }*

*}*

*extension FloatingPointType {*

* init<T: Box where T.BoxType == Int>(_ value: T) {*

* self.init(value.value)*

* }*

* init<T: Box where T.BoxType == Int8>(_ value: T) {*

* self.init(value.value)*

* }*

* init<T: Box where T.BoxType == Int16>(_ value: T) {*

* self.init(value.value)*

* }*

* init<T: Box where T.BoxType == Int32>(_ value: T) {*

* self.init(value.value)*

* }*

* init<T: Box where T.BoxType == Int64>(_ value: T) {*

* self.init(value.value)*

* }*

* init<T: Box where T.BoxType == UInt>(_ value: T) {*

* self.init(value.value)*

* }*

* init<T: Box where T.BoxType == UInt8>(_ value: T) {*

* self.init(value.value)*

* }*

* init<T: Box where T.BoxType == UInt16>(_ value: T) {*

* self.init(value.value)*

* }*

* init<T: Box where T.BoxType == UInt32>(_ value: T) {*

* self.init(value.value)*

* }*

* init<T: Box where T.BoxType == UInt64>(_ value: T) {*

* self.init(value.value)*

* }*

*}*

## ···

--

Wizard

james@supmenow.com

+44 7523 279 698