Tipo de segurança de Swift

implementos Swift segurança de tipo

, que basicamente significa que você não pode usar uma variável de forma inadequada para os termos de seu tipo. Em outras palavras, de acordo com as regras de segurança de tipo, você pode dividir por zero - isso não é um erro do tipo - mas você não pode executar uma operação aritmética com uma corda a menos que você fazer algumas conversões em primeiro lugar.

Tipo de segurança pode ser descrito em uma especificação de linguagem e é aplicada em um ambiente de desenvolvimento como Xcode- ele também pode ser executada com a programação cuidadosa. Isso é parte do problema: Sem aplicadas segurança de tipo, é muito fácil de deslizar para cima e criar um código inseguro.

Em muitos ambientes, código inseguro pode falhar a primeira vez que você executá-lo - este é o melhor cenário. Infelizmente, o cenário mais comum é que o código falha em vários momentos. Muitas vezes, o seu fracasso tem a ver com a memória a sua aplicação tem de trabalhar, de modo que o código não seguro pode falhar, dependendo do que outros aplicativos ou funções estão sendo executados no momento.

Deixando o ambiente de desenvolvimento reforçar a segurança de tipos é a forma mais segura de lidar com estes problemas. (Contando com as boas intenções das pessoas é, infelizmente, nem sempre a escolha mais sábia.)

A especificação de linguagem Swift descreve o seu tipo de segurança como parte do language- a especificação da linguagem inteira é forçado pelo compilador, bem como pelo ambiente de desenvolvimento Xcode. No uso comum, no entanto, muitas vezes as pessoas dizem coisas como # 147-Swift reforça segurança de tipo nº 148.;

Na verdade, Swift só fornece a specification- é Xcode eo compilador LLVM que fazer a aplicação. No entanto, a menos que haja uma razão para fazer uma distinção entre a especificação Swift e sua implementação no Xcode e compilador, este livro refere-se de uma forma geral para Swift.

Swift leva duas abordagens para reforçar a segurança de tipos: reforço padrões de codificação e inferir tipos. Ele usa outras abordagens bem, mas estas são as mais importantes.

Apertando padrões de codificação

Há muito tempo existe um trade-off (algumas pessoas diria que é um batalha) Entre as práticas de codificação de digitação estrita e solto de variáveis. digitação estrita é mais problema, e pode causar erros de compilação como os objetos do compilador para variáveis ​​vagamente-digitados. digitação solto é mais simples de escrever e incorre menos erros do compilador, mas pode causar mais erros de execução e falhas.

Swift aperta padrões de codificação. Em grande medida, estas normas consistem em restrições de linguagem que impedem código inseguro. Aqui estão algumas das medidas de segurança do tipo que Swift coloca no lugar e reforça:

  • ponteiros: Ponteiros permitem acessar a memória diretamente, o que pode levar a todos os tipos de problemas. A sintaxe básica Objective-C para acessar uma instância de uma classe envolve um ponteiro: Este não é o caso de Swift.

    Quando você declarar uma instância de uma classe, como UIView em Objective-C, você fazê-lo com um código como UIView * myView. Isso asterisco indica que você está trabalhando com um ponteiro (isto é simples sintaxe C de idade). Se você está acostumado a Objective-C, a maioria desses asteriscos são história para você. A exceção é se você está misturando Objective-C e Swift.

  • inicialização: Variáveis ​​deve ser inicializado em Swift antes do uso. Não há maneira de usar variáveis ​​não inicializadas no Swift.

  • Não nulo: Em outros idiomas, nada é frequentemente utilizada para fornecer um valor que pode ser testado para ver se existe um objecto. Em Swift isso é feito com tipos opcionais.

  • gerenciamento de memória e verificação de estouro: Swift herdou características Objective-C é implementado com comportamentos compilador avançadas, tais como a contagem de referência automático (ARC).

inferindo tipos

Porque Swift requer variáveis ​​(e constantes) para ser inicializado antes de ser usada, a biblioteca compilador e runtime sempre têm um valor para cada variável. Deste valor, Swift pode inferir um tipo sem ter que especificá-lo. Em outras palavras, você pode especificar o tipo para qualquer variável, mas você não tem que fazer isso, se essa variável é inicializada com um valor a partir do qual Swift pode inferir o tipo.

Arrays e dicionários em Swift deve conter instâncias do mesmo tipo. Assim, quando você criar uma matriz ou dicionário, você deve especificar explicitamente seu tipo ou fornecer valores iniciais para que Swift pode inferir o tipo da matriz ou dicionário. Em ambos os casos, Swift pode determinar o tipo de os valores na matriz ou dicionário.

Quando você está lidando com classes e subclasses, você pode querer usar um tipo explícito. Se a sua matriz ou dicionário está indo eventualmente conter instâncias de subclasses de uma determinada classe, você pode inicializá-lo com várias dessas subclasses.

Por exemplo, uma matriz que contém vários exemplos de UIView subclasses podem ser inicializados com um ou mais UILabel instâncias. No entanto, não há nenhuma maneira Swift pode inferir UIView de instâncias que não incluem todos os possíveis UIView subclasses. Então, se você está ciente de que você vai querer adicionar (digamos) UIButton casos mais tarde, você pode preferir escrever explicitamente a matriz como UIView por isso toda a UIView instâncias de subclasses são bem vindas.

menu