type tuple generic functions extension swift generics int double

generic - tuple swift



Do Int y Double comparten una clase para padres comĂșn en Swift (1)

Eche un vistazo al encabezado de Swift:

extension String : StringInterpolationConvertible { init(stringInterpolationSegment expr: String) init(stringInterpolationSegment expr: Character) init(stringInterpolationSegment expr: UnicodeScalar) init(stringInterpolationSegment expr: Bool) init(stringInterpolationSegment expr: Float32) init(stringInterpolationSegment expr: Float64) init(stringInterpolationSegment expr: UInt8) init(stringInterpolationSegment expr: Int8) init(stringInterpolationSegment expr: UInt16) init(stringInterpolationSegment expr: Int16) init(stringInterpolationSegment expr: UInt32) init(stringInterpolationSegment expr: Int32) init(stringInterpolationSegment expr: UInt64) init(stringInterpolationSegment expr: Int64) init(stringInterpolationSegment expr: UInt) init(stringInterpolationSegment expr: Int) }

Similar:

func +(lhs: UInt8, rhs: UInt8) -> UInt8 func +(lhs: Int8, rhs: Int8) -> Int8 func +(lhs: UInt16, rhs: UInt16) -> UInt16 func +(lhs: Int16, rhs: Int16) -> Int16 func +(lhs: UInt32, rhs: UInt32) -> UInt32 func +(lhs: Int32, rhs: Int32) -> Int32 func +(lhs: UInt64, rhs: UInt64) -> UInt64 func +(lhs: Int64, rhs: Int64) -> Int64 func +(lhs: UInt, rhs: UInt) -> UInt func +(lhs: Int, rhs: Int) -> Int func +(lhs: Float, rhs: Float) -> Float func +(lhs: Double, rhs: Double) -> Double func +(lhs: Float80, rhs: Float80) -> Float80

Si fuera posible escribir una función genérica para todos esos diferentes tipos numéricos, seguramente lo habrían hecho. Entonces la respuesta a tu pregunta debe ser No.

(Y en cualquier caso, difícilmente pueden compartir una clase para padres, ya que no son clases . Son estructuras).

Ahora, por supuesto, si solo se cuestionan Int y Double, podría extender Int y Double para adoptar un protocolo común y convertir ese protocolo en el tipo esperado ...

Me pregunto si existe una manera más fácil de escribir estos dos inicializadores como un Inicializador genérico

public required init(_ value : Double) { super.init(value: value, unitType: unit) } public required init(_ value : Int) { let v = Double(value) super.init(value: v, unitType: unit) }

Algo como:

public init<T>(_value : T) { let v = Double(T) super.init(value: v, unitType: unit) }

(que por supuesto no compila)

He revisado el código de Int y Double y me falta algo real que los vincule.