Qual é a palavra-chave 'aberta' no Swift?

334

O ObjectiveC.swiftarquivo da biblioteca padrão contém as seguintes linhas de código em torno da linha 228:

extension NSObject : Equatable, Hashable {
  /// ...
  open var hashValue: Int {
    return hash
  }
}

O que open varsignifica nesse contexto ou qual é a openpalavra - chave em geral?

Clashsoft
fonte
2
Possivelmente relacionado: stackoverflow.com/questions/24003918/… ("Qual é a diferença entre opene public?")
Ahmad F
Nota lateral: palavra-chave “aberto” veio do conceito “aberto para extensão, fechado para modificação”
Sazzad Hissain Khan

Respostas:

572

open é um novo nível de acesso no Swift 3, introduzido com a implementação do

Está disponível com o instantâneo Swift 3 de 7 de agosto de 2016 e com o Xcode 8 beta 6.

Em resumo:

  • Uma openclasse é acessível e subclassável fora do módulo de definição. Um openaluno é acessível e substituível fora do módulo de definição.
  • Uma publicclasse é acessível, mas não é subclassável fora do módulo de definição. Um publicmembro da classe está acessível, mas não pode ser substituído, fora do módulo de definição.

Assim opené o que publiccostumava ser nas versões anteriores do Swift e o acesso de publicfoi restrito. Ou, como Chris Lattner coloca no SE-0177: Permite distinguir entre acesso público e substituibilidade pública :

“Aberto” agora é simplesmente “mais público que público”, fornecendo um modelo muito simples e limpo.

No seu exemplo, open var hashValueé uma propriedade que é acessível e pode ser substituída nas NSObjectsubclasses.

Para mais exemplos e detalhes, consulte o SE-0117 .

Martin R
fonte
16
Então, publicno Swift 3, é como public finalno Swift 2, e opené assim public?
Clashsoft
16
@Clashsoft: "open" no Swift 3 é como "public" no Swift 2. "public" no Swift 3 não tem equivalente no Swift 2. (Uma classe final não pode ser subclassificada, nem mesmo no mesmo módulo.)
Martin R
59
Isso é hilariante contra-intuitivo. Obrigado pelo resumo.
GoldenJoe 13/09/16
7
Concorde com o @MikeS, e a falta de compatibilidade com versões anteriores torna isso uma bagunça horrível.
HughHughTeotl 23/09/16
14
@MikeS apple - pense diferente, mesmo que seja desnecessário.
Varun Nath
12

Leia aberto como

aberto para herança em outros módulos

Repito aberto para herança em outros módulos. Portanto, uma classe aberta é aberta para subclassificação em outros módulos que incluem o módulo de definição. Vars e funções abertos estão abertos para substituir em outros módulos. É o nível de acesso menos restritivo. É tão bom quanto o acesso público aceitar que algo público seja fechado para herança em outros módulos.

De Apple Docs :

O acesso aberto se aplica apenas a classes e membros da classe e difere do acesso público da seguinte maneira:

  1. Classes com acesso público, ou qualquer outro nível de acesso mais restritivo, podem ser subclassificadas apenas dentro do módulo em que estão definidas.

  2. Os alunos com acesso público, ou qualquer outro nível de acesso mais restritivo, podem ser substituídos por subclasses apenas dentro do módulo em que estão definidos.

  3. As classes abertas podem ser subclassificadas no módulo em que estão definidas e em qualquer módulo que importe o módulo em que estão definidas.

  4. Os membros da classe aberta podem ser substituídos por subclasses no módulo em que estão definidos e em qualquer módulo que importe o módulo em que estão definidos.
Mohammad Sadiq
fonte
5

Aberto é um nível de acesso, foi introduzido para impor limitações à herança de classes no Swift.

Isso significa que o nível de acesso aberto só pode ser aplicado a classes e membros da classe .

Nas aulas

Uma classe aberta pode ser subclassificada no módulo em que é definida e nos módulos que importam o módulo no qual a classe está definida.

Membros da classe

O mesmo se aplica aos alunos. Um método aberto pode ser substituído por subclasses no módulo em que é definido e nos módulos que importam o módulo no qual o método está definido.

A NECESSIDADE DESTA ATUALIZAÇÃO

Algumas classes de bibliotecas e estruturas não foram projetadas para serem subclassificadas e isso pode resultar em comportamento inesperado. A biblioteca nativa da Apple também não permitirá substituir os mesmos métodos e classes,

Portanto, após essa adição, eles aplicarão os níveis de acesso público e privado de acordo.

Para obter mais detalhes, consulte a documentação da Apple sobre controle de acesso.

Saranjith
fonte
1

Exceto pela subclasse, um open class functambém é acessível de qualquer lugar do seu projeto. Digamos que você esteja definindo uma função de classe aberta na sua classe Util como esta

open class Utils: NSObject {
    open class func printHello() {
        print("Hello from utils")
    }
}

Em qualquer lugar de seus controladores de exibição, você pode simplesmente acessar esse método chamando

Utils.printHello()
Fangming
fonte
3
Esta resposta não explica como é diferente do público, pois você também pode fazer isso com o público.
Jose Ramirez
Precisa de mais alguma explicação sobre isso
MD Aslam Ansari
1

aberto vem para jogar quando se lida com vários módulos.

A classe aberta é acessível e subclassável fora do módulo de definição. Um membro de classe aberto é acessível e substituível fora do módulo de definição.

Rajasekaran Gopal
fonte
0

aberto é apenas para outro módulo, por exemplo: vagens de cacau ou teste de unidade, podemos herdar ou substituir

William
fonte