¿Por qué aparece el error "Protocolo ... solo se puede usar como una restricción genérica porque tiene requisitos de tipo Self o asociados"?

Escribí una extensión enInt como a continuación.

extension Int {
    func squared () -> Int {
        return self * self
    }
}

print(10.squared()) // works

El código anterior funciona. Ahora quiero extender elIntegerType protocolo para que Int, UInt, Int64, etc. se ajusten. Mi código es el siguiente.

extension IntegerType {

    func squared () -> IntegerType { // this line creates error

        return self * self

    }
}

Me sale el error:

El protocolo 'IntegerType' solo puede usarse como una restricción genérica porque tiene requisitos de tipo Self o asociados

Ya viesta pregunta y su video yesta pregunta, todavía no podía entender. Solo entendí que hay algunosassociatedType que en este caso esSelf pero no pudo conectar los puntos. Siento también mi falta de conocimiento sobre elGenerics el sujeto también es una razón ...

¿Alguien puede elaborar un poco sobre el tema y por qué la extensión crea un error?

Respuestas a la pregunta(2)

Su respuesta a la pregunta