En la instancia de Objective-C, los datos pueden ser public
, protected
o private
. Por ejemplo:
@interface Foo : NSObject
{
@public
int x;
@protected:
int y;
@private:
int z;
}
-(int) apple;
-(int) pear;
-(int) banana;
@end
No he encontrado ninguna mención de modificadores de acceso en la referencia de Swift. ¿Es posible limitar la visibilidad de los datos en Swift?
access-modifiers
swift
Gergo Erdosi
fuente
fuente
Respuestas:
A partir de Swift 3.0.1 , hay 4 niveles de acceso , que se describen a continuación, desde el más alto (menos restrictivo) hasta el más bajo (más restrictivo).
1.
open
ypublic
Permita que una entidad se use fuera del módulo de definición (objetivo). Por lo general, utiliza
open
opublic
accede al especificar la interfaz pública a un marco.Sin embargo, el
open
acceso se aplica solo a las clases y a los miembros de la clase , y difiere delpublic
acceso de la siguiente manera:public
Las clases y los miembros de la clase solo pueden subclasificarse y anularse dentro del módulo de definición (destino).open
Las clases y los miembros de la clase pueden subclasificarse y anularse tanto dentro como fuera del módulo de definición (objetivo).2)
internal
Permite que una entidad se use dentro del módulo de definición (objetivo). Por lo general, utiliza el
internal
acceso al definir la estructura interna de una aplicación o un marco.3)
fileprivate
Restringe el uso de una entidad a su archivo fuente de definición. Por lo general, usa el
fileprivate
acceso para ocultar los detalles de implementación de una pieza específica de funcionalidad cuando esos detalles se usan dentro de un archivo completo.4)
private
Restringe el uso de una entidad a su declaración adjunta. Por lo general, usa el
private
acceso para ocultar los detalles de implementación de una pieza específica de funcionalidad cuando esos detalles se usan solo dentro de una sola declaración.fuente
Swift 4 / Swift 5
Como se menciona en la documentación de Swift - Control de acceso , Swift tiene 5 controles de acceso :
abierto y público : se puede acceder desde las entidades de su módulo y las entidades de cualquier módulo que importe el módulo de definición.
interno : solo se puede acceder desde las entidades de su módulo. Es el nivel de acceso predeterminado.
fileprivate y private : solo se puede acceder de forma limitada dentro de un ámbito limitado donde los defina.
¿Cuál es la diferencia entre open y public ?
open es lo mismo que public en versiones anteriores de Swift, permiten que las clases de otros módulos las usen y hereden, es decir: pueden subclasificarse de otros módulos. Además, permiten que los miembros de otros módulos los usen y los anulen. La misma lógica se aplica a sus módulos.
público permite que las clases de otro módulo las usen, pero no hereden, es decir: no se pueden subclasificar de otros módulos. Además, permiten que los miembros de otros módulos los usen, pero NO los anulen. Para sus módulos, tienen la misma lógica de apertura (permiten que las clases los usen y hereden; permiten a los miembros usarlos y anularlos).
Cuál es la diferencia entre fileprivate y private ?
Se puede acceder a fileprivate desde sus archivos completos.
solo se puede acceder a private desde su declaración única y a extensiones de esa declaración que están en el mismo archivo; Por ejemplo:
¿Cuáles son las diferencias entre Swift 3 y Swift 4 Access Control?
Como se menciona en la propuesta SE-0169 , el único refinamiento que se ha agregado a Swift 4 es que el alcance del control de acceso privado se ha ampliado para que sea accesible desde extensiones de esa declaración en el mismo archivo; Por ejemplo:
Por lo tanto, no es necesario declarar
myMessage
como archivo privado para ser accesible en todo el archivo.fuente
Cuando se habla de hacer un "método privado" en Swift u ObjC (o ruby o java o ...) esos métodos no son realmente privados. No hay control de acceso real a su alrededor. Cualquier lenguaje que ofrezca incluso una pequeña introspección permite a los desarrolladores obtener esos valores desde fuera de la clase si realmente lo desean.
Entonces, de lo que realmente estamos hablando aquí es de una forma de definir una interfaz pública que simplemente presente la funcionalidad que queremos y "oculte" el resto que consideramos "privado".
El mecanismo Swift para declarar interfaces es el
protocol
, y puede usarse para este propósito.Recuerde, los protocolos son tipos de primera clase y se pueden usar en cualquier lugar que un tipo pueda. Y , cuando se usan de esta manera, solo exponen sus propias interfaces, no las del tipo de implementación.
Por lo tanto, siempre que use en
MyClass
lugar deMyClassImplementation
en sus tipos de parámetros, etc., todo debería funcionar:Hay algunos casos de asignación directa en los que debe ser explícito con el tipo en lugar de confiar en Swift para inferirlo, pero eso no parece ser un factor decisivo:
Usar protocolos de esta manera es semántico, razonablemente conciso y, a mi parecer, se parece mucho a las Extensiones de clase que hemos estado utilizando para este propósito en ObjC.
fuente
Por lo que puedo decir, no hay palabras clave 'público', 'privado' o 'protegido'. Esto sugeriría que todo es público.
Sin embargo, Apple puede estar esperando que la gente use " protocolos " (llamados interfaces por el resto del mundo) y el patrón de diseño de fábrica para ocultar detalles del tipo de implementación.
Este es un buen patrón de diseño para usar de todos modos; ya que le permite cambiar su jerarquía de clases de implementación , manteniendo el sistema de tipo lógico igual.
fuente
Usando una combinación de protocolos, cierres y clases anidadas / internas, es posible usar algo a lo largo de las líneas del patrón del módulo para ocultar información en Swift en este momento. No es súper limpio o agradable de leer, pero funciona.
Ejemplo:
innerVal y mysteriousMath están ocultos aquí para uso externo e intentar cavar en el objeto debería dar lugar a un error.
Estoy solo en la mitad de mi lectura de los documentos de Swift, así que si hay un defecto aquí, por favor, indícalo, me encantaría saberlo.
fuente
reflect(h)[0].1.value // 19
A partir de Xcode 6 beta 4, Swift tiene modificadores de acceso. De las notas de la versión:
El valor predeterminado implícito es
internal
, por lo que dentro del objetivo de una aplicación puede dejar desactivados los modificadores de acceso, excepto donde desee ser más restrictivo. En un objetivo de marco (por ejemplo, si está incrustando un marco para compartir código entre una aplicación y una extensión de vista compartida o Hoy), usepublic
para designar la API que desea exponer a los clientes de su marco.fuente
Swift 3.0 proporciona cinco controles de acceso diferentes:
Niveles de acceso predeterminados
Todas las entidades en su código (con algunas excepciones específicas) tienen un nivel de acceso interno predeterminado si no especifica un nivel de acceso explícito. Como resultado, en muchos casos no necesita especificar un nivel de acceso explícito en su código.
La nota de lanzamiento sobre el tema:
Más información y detalles: El lenguaje de programación Swift (control de acceso)
fuente
En Beta 6, la documentación indica que hay tres modificadores de acceso diferentes:
Y estos tres se aplican a clases, protocolos, funciones y propiedades.
Para más información, consulte Control de acceso .
fuente
Ahora en beta 4, han agregado modificadores de acceso a Swift.
de Xcode 6 beta 4 notas reales :
fuente
Mecanismos de control de acceso según lo introducido en Xcode 6 :
El acceso predeterminado es interno y, como tal, no es necesario especificarlo. También tenga en cuenta que el especificador privado no funciona en el nivel de clase, sino en el nivel del archivo de origen. Esto significa que para obtener partes de una clase realmente privadas necesita separarse en un archivo propio. Esto también presenta algunos casos interesantes con respecto a las pruebas unitarias ...
Otro punto para mí, que se comenta en el enlace anterior, es que no se puede 'actualizar' el nivel de acceso. Si subclasifica algo, puede restringirlo más, pero no al revés.
Este último bit también afecta funciones, tuplas y seguramente otras cosas en la forma en que si una función usa una clase privada , entonces no es válido tener la función interna o pública , ya que podrían no tener acceso a la clase privada . Esto da como resultado una advertencia del compilador y debe volver a declarar la función como una función privada .
fuente
Swift 3 y 4 trajeron muchos cambios también para los niveles de acceso de variables y métodos. Swift 3 y 4 ahora tiene 4 niveles de acceso diferentes, donde el acceso abierto / público es el nivel de acceso más alto (menos restrictivo) y el acceso privado es el nivel de acceso más bajo (más restrictivo):
Interesante:
En lugar de marcar cada método o miembro como "privado", puede cubrir algunos métodos (por ejemplo, funciones auxiliares) en una extensión de una clase / estructura y marcar toda la extensión como "Privada".
Esta puede ser una buena idea, para obtener un mejor código mantenible. Y puede cambiar fácilmente (por ejemplo, para pruebas unitarias) a no privado simplemente cambiando una palabra.
Documentación de Apple
fuente
Para Swift 1-3:
No, no es posible. No hay ningún método / variable privado / protegido en absoluto.
Todo es publico.
Actualización Desde Swift 4, es posible ver otras respuestas en este hilo
fuente
Una de las opciones que podría usar es envolver la creación de la instancia en una función y proporcionar los captadores y establecedores apropiados en un constructor:
fuente
La gramática del lenguaje no tiene las palabras clave 'público', 'privado' o 'protegido'. Esto sugeriría que todo es público. Por supuesto, podría haber algún método alternativo para especificar modificadores de acceso sin esas palabras clave, pero no pude encontrarlo en la referencia del idioma.
fuente
Espero ahorrar algo de tiempo para aquellos que quieren algo similar a los métodos protegidos:
Según otras respuestas, swift ahora proporciona el modificador 'privado', que se define en función de los archivos en lugar de las clases, como los de Java o C #, por ejemplo. Esto significa que si desea métodos protegidos, puede hacerlo con métodos privados rápidos si están en el mismo archivo
Ej. Archivo 1:
Archivo 2:
}
fuente
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AccessControl.html#//apple_ref/doc/uid/TP40014097-CH41-ID3
ARRANQUE SWIFT 2.2;)
Por defecto interno
fuente
hasta swift 2.0 solo había tres niveles de acceso [Público, interno, privado] pero en swift 3.0 apple agregó dos nuevos niveles de acceso que son [Open, fileType], así que ahora en swift 3.0 hay 5 niveles de acceso Aquí quiero borrar el rol de estos dos niveles de acceso 1. Abierto: esto es muy similar a Público, pero la única diferencia es que el Público puede acceder a la subclase y anular, y el nivel de acceso Abierto no puede acceder a que esta imagen se tome del sitio web de Medium y esto describe la diferencia entre acceso abierto y público
Ahora al segundo nuevo nivel de acceso 2. el tipo de archivo es una versión más grande del nivel de acceso privado o menor que el interno. El alcance léxico de esta imagen está tomada del sitio web de Medium y esto describe la diferencia entre FileType y Private Level
fuente