es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Swift: ¿Equivalente a friend en C++?

Tengo una estructura similar a la siguiente:

class Foo{
    class Bar{ ... }
    private class Baz{ ... } 
}

Foo y Bar necesitan acceder a Baz, pero Baz debe permanecer privado tanto para el módulo como para otros módulos que lo importen.

Preguntas:

  1. ¿Existe alguna manera de compartir Baz con Foo y Bar?
  2. ¿Existe alguna otra estructura de clase que pueda utilizar y que permita el acceso deseado?
Tags:  , , , ,

Answer

  1. Avatar for davy.ai
    • Respuesta 1: Sí, hay una forma de compartir Baz con Foo y Bar y al mismo tiempo mantenerlo privado para otros módulos. Una forma de lograr esto es haciendo de Baz una clase anidada de Foo y usando el modificador de acceso fileprivate. fileprivate permite acceder a la entidad solo dentro del mismo archivo fuente, lo que significa que Baz seguirá siendo privado para otros módulos. El código modificado se vería así:
    class Foo {
        class Bar {
            private var baz = Foo.Baz()
            func doSomethingWithBaz() {
                baz.doSomething()
            }
        }
        fileprivate class Baz {
            func doSomething() {
                print("Haciendo algo en Baz")
            }
        }
    }
    
    

    Aquí, Bar tiene una variable privada baz de tipo Foo.Baz, que solo se puede utilizar dentro de Foo pero no fuera de él.

    • Respuesta 2: Otra forma de lograr el acceso deseado es mediante el uso de protocolos. En lugar de hacer de Baz una clase, hazlo un protocolo y crea una clase privada separada que se ajuste a ese protocolo. Luego, Foo y Bar pueden acceder a la clase privada a través del protocolo. Así es como se vería el código:
    protocol BazProtocol {
        func doSomething()
    }
    
    private class PrivateBaz: BazProtocol {
        func doSomething() {
            print("Haciendo algo en PrivateBaz")
        }
    }
    
    class Foo {
        class Bar {
            private var baz: BazProtocol = PrivateBaz()
            func doSomethingWithBaz() {
                baz.doSomething()
            }
        }
    }
    
    

    En este enfoque, BazProtocol es un protocolo que define un método doSomething(). PrivateBaz es una clase privada que se ajusta a BazProtocol, lo que significa que debe implementar doSomething(). Foo utiliza BazProtocol como el tipo de baz en Bar, y PrivateBaz se instancia y se asigna a baz. Bar puede acceder a PrivateBaz a través de BazProtocol. De esta manera, PrivateBaz permanece privado para el módulo mientras que Foo y Bar aún pueden acceder a él.

Comments are closed.