O Swift é uma nova linguagem de programação que combina os melhores recursos de linguagens mais antigas como Java, C++, Objective-C, etc. Todavia, existem grandes bases de código em C e C++. E se você possuir uma biblioteca desenvolvida em C++ e quiser usar esse código em sua aplicação Swift?
A seguir iremos ver como incorporar uma biblioteca C++ simples em um utilitário de linha de comando no Mac OS X. Iremos:
- Criar um utilitário de linha de comando com o Swift usando o Xcode.
- Criar uma biblioteca C++ simples usando o GCC.
- Adicionar um encapsulador C++ para fornecer uma interface entre a biblioteca C++ e o utilitário Swift.
- Chamar o encapsulador a partir do código Swift.
Para o restante do artigo, assumiremos que você conheça o uso básico do Xcode, Terminal do Mac OS X, e programação com Swift, C e C++.
Crie um utilitário de linha de comando com o Swift usando o Xcode
Para começar, iremos criar um utilitário de linha de comando simples com o Swift usando o Xcode. Poderiamos criar uma aplicativo gráfico mais sofisticado, mas como o foco aqui é apenas a interface entre o Swift e o código C++, um utilitário de linha de comando é suficiente, além de mais simples.
- No Xcode acessoe File->New->Project, na caixa de dialogo que aparece selecione Command Line Tool e clique em Next.
- Escolha um nome para seu projeto e digite no campo Product Name desta tela; certifique-se de que tenha selecionado Swift no campo Language. Para os propósitos deste artigo, vamos nomear o projeto de cli_swift. Clique em Next.
- Neste tela, selecione o local onde o projeto será armazenado e clique em Create. O projeto resultante deve consistir de um arquivo de código fonte Swift, main.swift, que contém o código:
import Foundation println("Hello, World!")
Podemos comentar ou remover a linha “import Foundation“, pois não usaremos nenhum recurso da biblioteca Founsation. - Agora podemos executar nosso projeto clicando no botão Run da barra de ferramentas, ou teclando Command-R. Veremos a mensagem “Hello, World!” impressa no terminal.
Crie uma biblioteca C++ usando o GCC
Agora vamos criar uma biblioteca estática simples em C++. Poderiamos ter feito isso no Xcode, mas vamos apenas usar um compilador de linha de comando, o GCC. O comando para compilar/ligar código C++ é g++. Você também pode usar o compilador Clang incluído em seu Mac OS X, nesse substitua o comando g++ por clang++ no exemplo.
- Escolha um local para armazenar a biblioteca e mude para esse diretório com o comando cd.
- Crie um arquivo de cabeçalho para a biblioteca, que no nosso exemplo chamaremos de junk.h, com o seguinte conteúdo:
class A { public: A(int); int getInt(); private: int m_Int; };
- Crie o arquivo de implementação da biblioteca, que chamaremos de junk.cpp, com o seguinte conteúdo:
#include "junk.h" A::A(int _i) : m_Int(_i) {} int A::getInt() { return m_Int; }
- Compile junk.cpp para um arquivo objeto, junk.o, e crie uma biblioteca, que chamaremos de libjunkcpp.a, que conterá o arquivo objeto ($ é o prompt de comando do Terminal):
$ g++ -c junk.cpp $ ar r libjunkcpp.a junk.o
Adicione um Encapsulador C++ ao projeto Xcode para fornecer uma interface Swift-C++
Agora que temos nossa biblioteca, vamos voltar ao Xcode e criar um arquivo C++ que será a interface entre nossa biblioteca C++ e o utilitário de linha de comando escrito em Swift. A interface precisa ser em C++ pois irá chamar o código C++ da biblioteca que não foi escrito para ser chamado a partir de código C. A interface é, porém, escrita de tal modo que pode ser chamada a partir de um código C, e coisas que podem ser chamadas a partir de código C podem ser tipicamente também chamadas a partir de código Swift. Veja os comentários no código a seguir.
- Adicione a biblioteca estática C++ ao projeto Xcode. Precisamos dessa etapa para poder chamar a biblioteca através do encapsulador C++. Veja aqui como fazer isso.
- Adicione o arquivo de cabeçalho da biblioteca, junk.h, ao projeto através da opção de menu File->Add Files to “cli_swift”…, navegando até o local do arquivo e clicando em Add.
- Vá até File->New->File, selecione C++ file na caixa de dialogo que aparece e clique em Next.
- Digite wrapper.cpp no campo Name, desmarque “Also create a header file,” e clique em Next.
- Na caixa de dialogo que aparece escolha um local para o novo arquivo e clique em Create.
- Se nesse ponto o Xcode sugerir que você crie um bridging header, clique em Yes. Caso contrário você pode criar um manualmente indo até a seção “Swift Compiler – Code Generation” em Build Settings e especificar um nome de cabeçalho na linha “Objective-C bridging Header”.
- Modifique o arquivo wrapper.cpp para que ele tenha o seguinte conteúdo:
#include "junk.h" // extern "C" will cause the C++ compiler // (remember, this is still C++ code!) to // compile the function in such a way that // it can be called from C // (and Swift). extern "C" int getIntFromCPP() { // Create an instance of A, defined in // the library, and call getInt() on it: return A(1234).getInt(); }
Use o C++ a partir do código Swift através do encapsulador
Agora precisamos informar ao Swift sobre o método getIntFromCPP(). Qualquer função que quisermos chamar no Swift precisa ser declarada no bridging header, de forma que devemos adicionar essa linha ao de nosso projeto: int getIntFromCPP();
Agora podemos chamar o método no código Swift adicionando a seguinte linha ao arquivo main.swift: println("The integer from C++ is \(getIntFromCPP())")
Execute o projeto, e a saída agora será: Hello, World! The integer from C++ is 1234
Traduzido de swiftprogrammer.info