Um guia passo a passo para converter um aplicativo Objective-C completo para Swift

Publicados: 2018-03-14

Desde seu lançamento em 2014, a linguagem de programação Swift da Apple passou por um crescimento fenomenal. A linguagem de programação conseguiu fazer o seu lugar entre as 10 principais linguagens de programação , compartilhando a posição com seu antecessor, Objective-C. Mas a guerra do rápido contra o objetivo-C nunca diminui.

Com esse aumento na popularidade e recursos interessantes, muitos desenvolvedores de aplicativos iOS que trabalhavam anteriormente com o Obj-C mudaram para a linguagem de programação Swift. Na verdade, dentro da luta de swift ou Objective-C para iOS, vários aplicativos iOS como LinkedIn, Yahoo Weather, Hipmunk e Lyft já foram atualizados de Objective-C para Swift, enquanto muitos planejam converter um aplicativo Objective-C para Swift.

FATORES QUE TORNAM O SWIFT UMA OPÇÃO MELHOR

Pessoalmente, tenho visto a evolução do Swift desde que sua primeira versão foi revelada e posso dizer que entre swift vs C, Swift substitui Objective-C com base em fatores, como

Código aberto

Swift é uma linguagem de código aberto e o código swift pode ser portátil em muito mais plataformas do que o Objective-C já foi.

Velocidade

Swift para desenvolvimento iOS é uma linguagem de tipo estático que funciona com o compilador LLVM e pode reutilizar o código existente, erradicar recursos não utilizados, gerenciar funções inline e assim por diante. Além disso, seu funcionamento é baseado em uma das mais rápidas aritméticas de cálculo do algoritmo C++, que por sua vez prova que ele tem uma vantagem competitiva em relação ao seu antecessor.

De acordo com o que a Apple afirma e eu experimentei, o algoritmo de pesquisa Swift é 2,6 vezes mais rápido que o Objective-C.

Legibilidade

Ao contrário do Objective-C, o Swift não está vinculado às fundações do C. Ele capacita os desenvolvedores iOS a remover chamadas de métodos aninhados, pular um ponto e vírgula no final de uma linha, evitar colocar @ no início de uma palavra-chave, concatenar string usando o sinal “+” e assim por diante. Além disso, a classe Swift não é dividida em partes, a interface e a implementação. Isso reduziu o comprimento do código para quase metade, tornando-o mais legível.

Por exemplo, quando o aplicativo Lyft foi reescrito em linguagem Swift do zero, o código do aplicativo diminuiu de 75.000 para 25.000 linhas. Esses números impressionantes reduzem os esforços dos desenvolvedores sem afetar o desempenho do aplicativo no cliente final.

Codificação interativa

Com seu recurso Playgrounds, ele permite que os programadores escrevam um pedaço de código ou algoritmo enquanto coletam feedback ao longo da fase de desenvolvimento. Como o código Swift é escrito usando visualizações de dados, isso torna o processo de desenvolvimento de aplicativos mais fácil e acessível.

Segurança

Swift é uma linguagem mais segura e segura para construir um aplicativo de acordo com as tendências atuais do mercado. Sua sintaxe e construção de linguagem excluíram os tipos de erros comumente observados durante a codificação em linguagem Objective-C. Isso implica que há menos chances de travamento do aplicativo e casos de comportamento problemático.

Diferentemente do caso do Objective-C, o código escrito em Swift pode ser compilado e os erros podem ser corrigidos, junto com a parte de escrita do código. Assim, o Swift atua melhor e mais rápido no processo de teste, quando comparado ao processo de teste do código Objective-C.

Manutenção

Como o Swift não depende de C como seu antecessor, a manutenção no caso de desenvolvimento de aplicativos Swift é muito mais fácil. Algo que fez do Swift o futuro do desenvolvimento de aplicativos iOS .

No caso de construir um aplicativo iOS usando Objective-C, os desenvolvedores deveriam manter dois arquivos de código distintos para aumentar o tempo de compilação e a eficiência do código. No entanto, Swift abandonou esse mecanismo de dois arquivos, mesclando o cabeçalho Objective-C (.h) e os arquivos de implementação (.m) em um único arquivo (.swift). O compilador LLVM descobre automaticamente as dependências ao ler o arquivo Swift, o que é um grande benefício para os desenvolvedores de aplicativos iOS.

Além dos fatores mencionados acima, o benefício digno de menção de escolher o Swift em vez de outra linguagem de programação da Apple é sua compatibilidade com Objective-C. A Apple ofereceu aos desenvolvedores de aplicativos a possibilidade de usar os dois idiomas no mesmo projeto. Isso não é útil apenas no caso de desenvolver um aplicativo iOS usando Swift do zero, mas também na atualização de seu aplicativo existente para Swift usando código Objective-C.

Embora agora você esteja familiarizado com as diferenças filosóficas entre as duas linguagens de desenvolvimento de aplicativos iOS, vamos passar para as diferenças durante a implementação prática.

SWIFT VS OBJECTIVE-C: PRINCIPAIS DIFERENÇAS ENTRE OS TITÃS DO DESENVOLVIMENTO IOS

Com minha experiência com base de código complexa Objective-C e base de código Swift, você encontrará várias atualizações para os conceitos existentes, juntamente com uma introdução a vários novos elementos, tornando o processo de desenvolvimento de aplicativos mais rápido. Sem enrolação, vamos dar uma olhada em tudo que você vai encontrar de novo/diferente na guerra de velocidade vs objetivo c.

Opcionais

Quando falamos sobre desempenho swift vs Objective-C, podemos chamar métodos em objetos nil para obter um valor zero em Obj-C. Temos que executar manualmente verificações de nil para entender o comportamento indefinido em caso de valor nil inesperado. No entanto, esse problema pode ser resolvido usando Optional, um novo conceito introduzido no código Swift. Opcional permite que funções que podem não ser capazes de retornar um valor significativo retornem um valor encapsulado em opcional ou nil.

A sintaxe de declarar o tipo opcional é:

Public enum Optional<Wrapped> :_Reflectable, NilLiteralConvertible

Praticamente, pode ter um valor do tipo Wrapped ou um valor inexistente.

Swift renderiza o açúcar sintático para declarar tipos opcionais, então podemos substituir o Optional<String> por String?

Existem basicamente duas maneiras de obter o valor encapsulado do contêiner opcional:

Encadeamento Opcional: Usado no caso em que a instrução condicional if-let receberá um valor somente se existir.
Forced Wrapping: Usado quando a variável declarada opcional não é nula. Se o valor existir, ele fornecerá a saída sem condições de implementação. Mas, no outro caso, ele irá falhar.
Também podemos encontrar opcionais desempacotados implicitamente na linguagem Swift, declarados como String!

Por exemplo:

Classe XClasse

{

var aString: String

var bString: String!

var cString: String?

Init (string: String)

{

aString = string

}

}

Aqui,

Uma String nunca pode ser nula. É crucial que esta variável tenha um valor durante a inicialização do objeto, caso contrário o programa levará a uma falha.
B String pode ser nula. No entanto, se você tentar acessar nil object, o programa irá travar.
C String pode ser nula e deve ser tratada como uma variável opcional regular.
Extensões
As extensões e categorias encontradas em Obj-C são consolidadas em uma única entidade, extensões em linguagem Swift. As extensões adicionam novas funcionalidades a uma classe, enumeração, estrutura ou protocolo já existente, e a melhor parte é que você não precisa ter acesso ao código-fonte original para estender os tipos.

Tuplas
Além dos Optionals, outro novo tipo de dados introduzido na nova linguagem de desenvolvimento da Apple é o Tuples. Tuplas (tipo de dados definido pelo usuário no local) são basicamente consideradas para agrupar muitos valores em um único grupo composto. É o elemento certo a ser considerado se você acha que a criação de um modelo em um local pode ser um exagero e o dicionário não é fácil de ler o suficiente. Para saber mais Tuplas, consulte este blog .

Genéricos
Generics é um dos recursos mais marcantes da linguagem de programação Swift e, de fato, muitas das bibliotecas padrão Swift são criadas com código Swift. O código genérico permite que os desenvolvedores escrevam funções e tipos flexíveis e reutilizáveis ​​que podem trabalhar com diferentes conjuntos de tipos, sujeitos aos requisitos definidos. Isso minimiza o risco de duplicação e melhora a legibilidade do código com uma abordagem clara e abstrata.

De acordo com minha experiência, os genéricos são difíceis de obter no início, assim como as recursões. Mas, quando você colocar as mãos nele, poderá desenrolar um mundo totalmente novo de correção de problemas lógicos cansativos.

Enumeração
No código Objective-C, as enumerações são restritas a tipos primitivos. Para mapear valores de enumeração de inteiros para os de strings para exibir a saída, você precisa introduzir uma matriz ou virar para a estrutura de controle do switch. No entanto, você não precisa passar por esses aborrecimentos com a linguagem de desenvolvimento de aplicativos Swift iOS.

O Swift oferece novas enumerações variadas com mais opções. As enumerações Swift podem ter valores associados e o caso de enumeração Swift pode conter um conjunto predefinido de campos. Na verdade, as enumerações do Swift podem ser recursivas e podem armazenar valores brutos.

Por exemplo:
códigos

Subscritos
Os subscritos podem ser vistos como um meio para acessar informações de uma sequência, coleção ou lista em classes, enumerações e estruturas sem usar um método. Você pode considerar subscritos para definir e recuperar valores por índice sem criar métodos separados para armazenamento e recuperação. Por exemplo, você pode acessar elementos em uma instância de Array como someArray[index] e elementos em uma instância de Dictionary como someDictionary[key].

A sintaxe para declarar um Subscrito é a seguinte:

subscrito (índice: Int) -> Int {

pegue {

//para declarar valor subscrito

}

set (novoValor) {

//para definir valores

}

}

Tipo de inferência

Swift também propôs a segurança de tipos para o desenvolvimento de aplicativos iOS, segundo a qual uma variável quando declarada com um determinado tipo, seu tipo será estático e imutável. O compilador determinará (ou inferirá) que tipo sua variável será com base nos valores que você atribuir.

Por exemplo:

código 1
Aqui, o compilador mostrará um erro quando você tentar inicializar com valores numéricos para uma variável str2 (veja abaixo)

código 03

Funções
A sintaxe Function na linguagem de programação Swift é mais flexível para definir do que no estilo de código Objective-C complexo. No Swift, cada função tem um tipo que compreende os tipos de parâmetro da função e o tipo de retorno, o que implica que você pode atribuir funções a uma variável ou passá-la como um valor para outras funções (como mostrado no exemplo abaixo):

imagem de código

Além disso, o Swift também permite que os desenvolvedores de aplicativos definam valores padrão para parâmetros funcionais.

Manipulação de erros
O Swift oferece uma abordagem totalmente nova para lançar, capturar, circular e manipular erros recuperáveis ​​em tempo de execução. Para obter um vislumbre do tratamento de erros no Swift, consulte o blog.

Além desses, vários conceitos que tornam o desenvolvimento de aplicativos Swift uma vantagem sobre o desenvolvimento de aplicativos Objective-C são:

Modelos
No caso do Swift, os modelos são preferidos como structs em vez de classes.

Protocolos
No primeiro dos vídeos da WWDC da Apple, o swift foi apresentado como “linguagem orientada a protocolos”. Um protocolo pode ser definido como um esquema de métodos, propriedades e outras entidades que se adequam a uma determinada tarefa/parte de funcionalidade. Eles podem ser adotados por uma classe, enumeração ou estrutura para facilitar uma implementação real desses requisitos e são muito mais poderosos em comparação com o Obj C com os recursos de fornecer implementações padrão, incorporar genéricos etc.

Como desenvolvedor de aplicativos iOS, prefiro criar um protocolo antes de definir uma classe como a prática mais eficaz para aproveitar os benefícios da linguagem de programação avançada da Apple.

Abordagem de Programação Funcional
O Swift capacita os desenvolvedores a usar mais abordagens funcionais para resolver problemas mundanos do que empregar loops tradicionais ou tipos de referências. Aqui, a perspectiva é analisar um problema em termos de qual é a solução, em vez de determinar como obter a solução como é feito na abordagem tradicional.

Da minha experiência com a linguagem iOS, uma coisa que notei é que o que estávamos fazendo por iterações usando loops for em Objective-C pode ser feito usando o conceito de Filter, Map e Reduce em Swift. Para obter informações detalhadas sobre essas funções de alta ordem na programação funcional, consulte o blog.

GUIA PASSO A PASSO PARA CONVERTER UM APLICATIVO OBJECTIVE-C COMPLETO PARA SWIFT

Hoje, existem várias ferramentas para converter um aplicativo de Objective-C para Swift linha por linha. No entanto, aconselho não usar nenhum. Embora ambas as linguagens iOS sejam interoperáveis, seus paradigmas de programa são diferentes. Migrar um aplicativo diretamente do Obj-C para o Swift trará um risco maior de usar os paradigmas errados. Deixe-me elaborar sobre isso.

Swift, ao contrário de seu antecessor, é influenciado pelo paradigma de programação funcional, o que o torna fortemente dependente da imutabilidade. Por exemplo, se você falar sobre arrays e dicionários – esses modelos básicos são usados ​​para ser um tipo de referência em Objective-C, mas eles são um tipo de valor em Swift, portanto, imutáveis. Isso implica que converter o código Obj-C para Swift subconscientemente usando qualquer ferramenta fará com que você enfrente muitos erros difíceis de depurar. Além disso, o Swift possui vários novos recursos (como já descrito acima) que tornam os algoritmos/abordagens mais eficientes e os programas mais rápidos! Na verdade, é a principal razão pela qual a Apple lançou uma nova linguagem em vez de atualizar o Obj-C. Com todos esses pontos em consideração, recomendo que todos escrevam um novo aplicativo em Swift a partir do zero, em vez de fazer a conversão linha por linha de Obj-C para Swift.

Ainda assim, se você deseja converter um aplicativo Objective-C completo para Swift, uma ferramenta que você pode usar é o Swiftify. A ferramenta facilita o processo de atualização do código Obj-C para a nova linguagem de programação da Apple em um clique; economizando milhares de horas de trabalho. O recurso de interoperabilidade permite integrar o código iOS convertido de volta ao Objective-C sem qualquer aborrecimento, o que significa que você pode explorar a infinidade de opções que o Swift oferece e, em seguida, integrá-lo de volta ao seu projeto Obj-C sem reescrever tudo de uma vez.

Prepare seu código de aplicativo existente para conversão
É sempre melhor começar com o código Obj-C mais recente. Isso ocorre porque o Xcode dispõe de um moderno conversor Objective-C que pode ajudá-lo com:

1. Alterar o id para o tipo de instância sempre que possível
2. Empregando as macros de enumeração corretas
3. Atualizando para a sintaxe @property mais recente

Embora o conversor ajude na mecânica de análise e aplicação de possíveis alterações, ele não descreve a semântica do código. Portanto, é aconselhável que todos os desenvolvedores de aplicativos iOS revisem tudo manualmente uma vez e confirmem as alterações.

Para usar o conversor, selecione Editar -> Refatorar -> Alterar para a sintaxe Modern Objective-C.

O processo de migração de código Objective-C para Swift
A abordagem mais eficaz para converter um aplicativo Objective-C completo para Swift é, para começar, uma classe por vez, especialmente uma classe sem nenhuma subclasse, já que você não pode subclassificar classes Swift em Obj-C.

Substitua os arquivos .me .h relacionados à classe por um único arquivo .swift. Com isso, tudo, desde a interface até a implementação, entrará automaticamente no arquivo Swift. Além disso, você não precisa criar um arquivo de cabeçalho, pois o Xcode gera automaticamente um cabeçalho, se necessário.

Projetando um arquivo de cabeçalho de ponte
Ao adicionar seu primeiro arquivo .swift, você encontrará um prompt como o mostrado abaixo.

código rápido12

Clique na opção ' Criar Cabeçalho de Ponte '.

Um guia passo a passo

1. Escolha um par de arquivos .he .m que você deseja converter em Swift. Se você quiser converter todo o projeto, deixe a classe AppDelegate para mais tarde.
2. Procure por #import “MyViewController.h” em todo o código e remova-o do arquivo de cabeçalho de ponte Objective-C ([MyProject]-Bridging-Header.h).
3. Substitua as instâncias de #import “[filename].h” por #import “[MyProject]-Swift.h” em todos os arquivos .m e coloque @class [filename] em vez de #import “[filename].h” em todos os arquivos .h.
4. Transforme a parte dos arquivos Obj-C em Swift. Isso pode ser feito facilmente usando a extensão Finder de 'Swiftify for Xcode'. Caso contrário, copie o conteúdo dos arquivos .m e .h para .swift e use a opção “Convert File to Swift” disponível na Swiftify Xcode Extension.
5. Substitua os arquivos .he .m por arquivos .swift convertidos no projeto.
6. Compile o projeto e corrija os erros de conversão. Embora muitos problemas sejam facilmente gerenciados usando as sugestões de correção automática do Xcode, você também pode contar com o Swiftify para relatar e corrigir os erros que aparecem várias vezes no projeto.
7. Uma vez feito, construa e execute o projeto. Se surgir o problema de 'Class not Found' seguido de travamento, encontre todas as referências a ele no Editor de Storyboard. Digite novamente o nome da classe no Identity Inspector, salve e tente novamente.
8. Se você estiver convertendo o projeto inteiro, poderá transformar a classe AppDelegate agora. Neste ponto, todos os outros arquivos foram convertidos para Swift e, portanto, se não houver arquivos Obj-C no destino, você pode excluir facilmente o arquivo main.me .pch (cabeçalho pré-compilado).

Qual prática você prefere – criar um novo aplicativo iOS em Swift do zero ou converter Objective-C em Swift completamente? Compartilhe suas opiniões através da seção de comentários abaixo.