Avatar ·

¿Qué significa la palabra clave `open` en Swift y en qué se diferencia de `public`?

¡Hola a todos! Empecé a estudiar Swift recientemente y tengo confusión con los modificadores de acceso. En la documentación leí sobre `public`, `internal`, `fileprivate` y `private`, pero luego me topé con `open`. Entiendo que `public` hace que una clase o método sea accesible desde otro módulo. Pero, ¿para qué se necesita `open`? ¿Acaso `public` no hace lo mismo? Aquí hay un ejemplo: creé mi propio framework y quiero que los usuarios no solo puedan usar mi clase, sino también heredar de ella. Si pongo `public`, la clase será visible, pero el compilador no permitirá heredar de ella. Si pongo `open`, la herencia está permitida. ¿Por qué es así? También me confunde que `open` solo se puede aplicar a clases y miembros de clase. Y para estructuras y protocolos, según entendí, `open` no se usa. ¿Es cierto? Y otra pregunta: si estoy escribiendo una aplicación normal (no un framework), ¿necesito usar `open`? ¿O es suficiente con `public`? Agradecería una explicación con ejemplos, porque en la documentación oficial...