SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
14.11.2024

Aula 27: Controle de Acesso (Público, Privado, etc.)

O controle de acesso é um conceito essencial no Swift que ajuda a regular a visibilidade e acessibilidade de classes, structs, propriedades, métodos e outras entidades no seu código. Ao entender o controle de acesso, você pode encapsular seu código de forma mais eficaz, promover um design modular e restringir o acesso a partes específicas do seu código com base nas suas necessidades.

O Swift oferece vários níveis de acesso: open, public, internal, fileprivate e private. Vamos mergulhar em cada nível de acesso com exemplos.

Níveis de Acesso no Swift

1. open

O nível de acesso open é o mais permissivo. Ele permite que entidades sejam utilizadas e subclassificadas fora do módulo que as define. Por padrão, classes e métodos de classe marcados como open podem ser sobrescritos em outros módulos.

// Módulo A
open class Animal {
    open func emitirSom() {
        print("Um som genérico")
    }
}

// Módulo B
class Cachorro: Animal {
    override func emitirSom() {
        print("Au Au")
    }
}

2. public

O nível de acesso public permite que entidades sejam utilizadas em qualquer arquivo fonte do seu módulo e em qualquer módulo que importe o módulo que as define. No entanto, ao contrário de open, public não permite que subclasses ou métodos sejam sobrescritos fora do módulo que os define.

// Módulo A
public class Veiculo {
    public func iniciar() {
        print("Veículo iniciando")
    }
}

// Módulo B
let carro = Veiculo()
carro.iniciar()  // Funciona já que a classe é pública

3. internal

O nível de acesso internal é o nível de acesso padrão para entidades no Swift. Ele permite que entidades sejam acessadas dentro do módulo em que foram definidas, mas não fora desse módulo. Na maioria das vezes, você encontrará esse nível adequado para seus tipos e métodos.

// Módulo A
class Carro {
    func dirigir() {
        print("Carro está dirigindo")
    }
}

// Acessível dentro do mesmo módulo
let meuCarro = Carro()
meuCarro.dirigir()

4. fileprivate

O nível de acesso fileprivate restringe o uso de uma entidade ao seu próprio arquivo de definição. Isso é útil quando você deseja ocultar detalhes de implementação dentro de um único arquivo.

// Arquivo: Exemplo.swift
class Computador {
    fileprivate func inicializar() {
        print("Computador inicializando")
    }

    func iniciar() {
        inicializar()  // Permitido
    }
}

// Acessar inicializar() de fora deste arquivo não será permitido
let meuPC = Computador()
// meuPC.inicializar()  // Erro: 'inicializar' é inacessível devido à proteção 'fileprivate'
meuPC.iniciar()  // Permitido

5. private

O nível de acesso private restringe o uso de uma entidade ao escopo de fechamento. Isso fornece o maior nível de encapsulamento, garantindo que o acesso seja limitado ao contexto circundante da classe ou struct.

class Telefone {
    private var senha = "1234"

    private func desbloquear() {
        print("Telefone desbloqueado")
    }

    func usarTelefone() {
        desbloquear()  // Permitido
        print("Usando telefone")
    }
}

let meuTelefone = Telefone()
// meuTelefone.desbloquear()  // Erro: 'desbloquear' é inacessível devido à proteção 'private'
meuTelefone.usarTelefone()  // Permitido

Resumo

O controle de acesso é um recurso poderoso no Swift que permite controlar a visibilidade e acessibilidade dos componentes do seu código. Aqui está um rápido resumo dos níveis de acesso:

  • open: Acessível e subclassificável fora do módulo.
  • public: Acessível fora do módulo, mas não subclassificável.
  • internal: Nível padrão; acessível dentro do mesmo módulo.
  • fileprivate: Acessível apenas dentro do arquivo que o define.
  • private: Acessível apenas dentro do escopo de fechamento.

Ao aproveitar esses níveis de acesso, você pode criar códigos robustos, modulares e de fácil manutenção no Swift. Use-os sabiamente para encapsular sua lógica e proteger seus dados!

Boa programação!

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!