metainformación metainformacion definicion swift3

swift3 - metainformacion - No se puede extender una estructura genérica para un tipo específico



metainformacion definicion (1)

La forma en que se suele encontrar este obstáculo es cuando intenta extender Array. Esto es legal:

extension Array where Element : Comparable { }

Pero esto es ilegal:

extension Array where Element == Int { }

El compilador se queja:

El requisito del mismo tipo hace que el parámetro genérico ''Elemento'' no sea genérico

El problema es el uso de == aquí en combinación con Elemento de tipo parametrizado de Array, porque Array es una estructura genérica.

Una solución con Array es elevar la jerarquía de la herencia de Array para llegar a algo que no es una estructura genérica:

extension Sequence where Iterator.Element == Int { }

Eso es legal porque Sequence e Iterator son protocolos genéricos.

Otra solución, sin embargo, es elevar la jerarquía desde el tipo de destino, es decir, Int. Si podemos encontrar un protocolo al cual Int se ajuste, entonces podemos usar el operador : lugar de == . Bueno, hay uno:

extension CountableClosedRange where Bound : Integer { }

Esa es la verdadera diferencia entre nuestros dos intentos de implementar al random en un rango. La razón por la que tu intento golpea una barricada y la mía no es porque estás usando == mientras estoy usando : Puedo hacer eso porque hay un protocolo (FloatingPoint) con el que Double se ajusta.

Pero, como te han dicho, con suerte todo este truco pronto será cosa del pasado.

Quería jugar con agregar algo de azúcar en Swift3. Básicamente, quería poder hacer algo como:

let randomAdjust = (-10...10).random

Para hacer eso, decidí que necesitaría extender ClosedRange . Pero luego descubrí que probablemente sería aún mejor para mi caso, realmente solo planeo hacer Int por ahora, usar CountableClosedRange . Mi último intento múltiple parecía:

extension CountableClosedRange where Bound == Int { var random:Int { return Int(arc4random_uniform(UInt32(self.count) + 1)) + self.lowerBound } }

Pero el patio de recreo se queja:

error: same-type requirement makes generic parameter ''Bound'' non-generic extension CountableClosedRange where Bound == Int {

Ni siquiera sé lo que me está diciendo allí.