{"id":126,"date":"2017-05-05T19:40:03","date_gmt":"2017-05-05T22:40:03","guid":{"rendered":"https:\/\/www.linuxpro.com.br\/2017\/05\/instalando-swift-no-linux\/"},"modified":"2026-09-12T09:48:39","modified_gmt":"2026-09-12T12:48:39","slug":"instalando-swift-no-linux","status":"publish","type":"post","link":"https:\/\/www.linuxpro.com.br\/es\/2017\/05\/instalando-swift-no-linux\/","title":{"rendered":"Swift en Linux: instalaci\u00f3n, Hola Mundo y primer proyecto"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/09\/swift-v3.webp?v=20260912\" alt=\"Mascote LinuxPro programando em Swift numa esta\u00e7\u00e3o Linux, acompanhado do cachorro caramelo cyborg sentado ao lado\" width=\"1486\" height=\"856\" \/><\/p>\n<div style=\"background:#fff8e1;border-left:4px solid #8b1a1a;padding:.8em 1em;margin:1em 0\"><strong>Nota (2026):<\/strong> Publicado originalmente em maio de 2017 para Swift 3.1 no Ubuntu; este guia foi revisado em 12 de setembro de 2026 para o fluxo atual com Swiftly, mantendo a URL e a data hist\u00f3rica.<\/div>\n<p>Quer experimentar Swift no Linux sem come\u00e7ar por um projeto enorme? Vamos instalar a linguagem, executar um Hello World, gerar um bin\u00e1rio e montar uma pequena ferramenta de terminal com argumentos. O objetivo \u00e9 sair deste artigo com c\u00f3digo funcionando e entender a diferen\u00e7a entre <code data-no-translation=\"\">swift<\/code>, <code data-no-translation=\"\">swiftc<\/code> e Swift Package Manager.<\/p>\n<p><!-- more --><\/p>\n<h2>Antes de instalar: linguagem Swift n\u00e3o \u00e9 OpenStack Swift<\/h2>\n<p>Este tutorial trata da linguagem de programa\u00e7\u00e3o. O <a href=\"https:\/\/packages.debian.org\/bookworm\/swift\">pacote chamado swift no Debian<\/a> pertence ao OpenStack, um sistema de armazenamento de objetos. N\u00e3o use <code data-no-translation=\"\">apt install swift<\/code> como atalho para instalar o compilador deste artigo: confira sempre a descri\u00e7\u00e3o do pacote.<\/p>\n<p>Use uma distribui\u00e7\u00e3o e arquitetura presentes nas op\u00e7\u00f5es oficiais de <a href=\"https:\/\/www.swift.org\/install\/linux\/\">instala\u00e7\u00e3o do Swift no Linux<\/a>. Os exemplos de prepara\u00e7\u00e3o abaixo usam Ubuntu\/Debian e Bash. Veja a distribui\u00e7\u00e3o e a arquitetura antes de escolher qualquer download:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">cat \/etc\/os-release\nuname -m<\/code><\/pre>\n<p>Para come\u00e7ar, reserve uma pasta no seu usu\u00e1rio e tenha acesso \u00e0 internet. Depend\u00eancias do sistema podem exigir sudo; o projeto e os comandos de compila\u00e7\u00e3o n\u00e3o precisam ser executados como root.<\/p>\n<h2>Instale com Swiftly e confira a assinatura<\/h2>\n<p>O Swiftly gerencia as toolchains da linguagem. Na consulta de 12\/09\/2026, a p\u00e1gina oficial indicava Swift 6.3.3 e Swiftly 1.1.2. As vers\u00f5es podem mudar: confira a <a href=\"https:\/\/www.swift.org\/install\/linux\/swiftly\/\">instru\u00e7\u00e3o oficial do Swiftly<\/a> antes de repetir o procedimento no futuro.<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">sudo apt update &amp;&amp; sudo apt install -y ca-certificates curl gnupg tar<\/code><\/pre>\n<p>Baixe o instalador, as chaves publicadas pelo projeto e a assinatura. A vari\u00e1vel <code data-no-translation=\"\">ARCH<\/code> deve corresponder a uma arquitetura oferecida pelo site, como <code data-no-translation=\"\">x86_64<\/code> o <code data-no-translation=\"\">aarch64<\/code>:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">mkdir -p \"$HOME\/Downloads\/swiftly-linuxpro\"\ncd \"$HOME\/Downloads\/swiftly-linuxpro\"\nARCH=\"$(uname -m)\"\nARQUIVO=\"swiftly-1.1.2-${ARCH}.tar.gz\"\nBASE=\"https:\/\/download.swift.org\/swiftly\/linux\"\n\ncurl -fLO \"$BASE\/$ARQUIVO\" &amp;&amp;\ncurl -fLO \"$BASE\/$ARQUIVO.sig\" &amp;&amp;\ncurl -fL https:\/\/www.swift.org\/keys\/all-keys.asc -o swift-keys.asc &amp;&amp;\ngpg --import swift-keys.asc &amp;&amp;\ngpg --verify \"$ARQUIVO.sig\" \"$ARQUIVO\"<\/code><\/pre>\n<p>Se a verifica\u00e7\u00e3o falhar, pare: n\u00e3o extraia nem execute aquele arquivo. Depois de confirmar a assinatura, inicialize o Swiftly:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">tar -xzf \"$ARQUIVO\" &amp;&amp;\n.\/swiftly init --quiet-shell-followup &amp;&amp;\n. \"${SWIFTLY_HOME_DIR:-$HOME\/.local\/share\/swiftly}\/env.sh\" &amp;&amp;\nhash -r\n\nswift --version\nswiftc --version<\/code><\/pre>\n<p>A inicializa\u00e7\u00e3o baixa a toolchain e informa os pacotes necess\u00e1rios que estiverem faltando. Siga essas orienta\u00e7\u00f5es para a sua distribui\u00e7\u00e3o. O arquivo de ambiente ajusta a sess\u00e3o atual; em outro terminal, confira novamente <code data-no-translation=\"\">swift --version<\/code>. N\u00e3o reutilize listas antigas de bibliotecas do Ubuntu 16.04.<\/p>\n<h2>Hello World b\u00e1sico: um arquivo e uma linha<\/h2>\n<p>Comece fora da pasta do instalador. Crie um diret\u00f3rio de estudos e um arquivo chamado <code data-no-translation=\"\">hello.swift<\/code>:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">mkdir -p \"$HOME\/projetos\/swift-linuxpro\"\ncd \"$HOME\/projetos\/swift-linuxpro\"\ncat &gt; hello.swift &lt;&lt;'SWIFT'\nprint(\"Hello, world!\")\nSWIFT\n\nswift hello.swift<\/code><\/pre>\n<p>A sa\u00edda esperada \u00e9:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-text\" data-no-translation=\"\">Hello, world!<\/code><\/pre>\n<p>Aqui, <code data-no-translation=\"\">print<\/code> escreve uma mensagem na sa\u00edda padr\u00e3o. A chamada <code data-no-translation=\"\">swift hello.swift<\/code> executa o arquivo sem voc\u00ea administrar manualmente um execut\u00e1vel. \u00c9 um bom caminho para pequenos experimentos; n\u00e3o \u00e9 necess\u00e1rio criar um pacote para cada teste.<\/p>\n<h2>Compile o mesmo programa com swiftc<\/h2>\n<p>Agora gere um execut\u00e1vel com nome definido:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">swiftc hello.swift -o hello\n.\/hello<\/code><\/pre>\n<p>A mensagem \u00e9 a mesma, mas o fluxo mudou: primeiro voc\u00ea compilou; depois executou <code data-no-translation=\"\">.\/hello<\/code>. Quando alterar o c\u00f3digo, rode o compilador novamente para atualizar o bin\u00e1rio. O prefixo <code data-no-translation=\"\">.\/<\/code> indica que o arquivo est\u00e1 no diret\u00f3rio atual.<\/p>\n<p>Um bin\u00e1rio compilado no seu computador n\u00e3o \u00e9 automaticamente compat\u00edvel com todo Linux. Arquitetura, bibliotecas e runtime do ambiente de destino importam. Para distribui\u00e7\u00e3o mais controlada, estude o <a href=\"https:\/\/www.swift.org\/documentation\/articles\/static-linux-getting-started.html\">Swift SDK for Static Linux<\/a>; isso \u00e9 uma etapa posterior ao Hello World.<\/p>\n<h2>Crie uma ferramenta com Swift Package Manager<\/h2>\n<p>Quando o c\u00f3digo ganha mais arquivos e depend\u00eancias, use o Swift Package Manager, que acompanha a toolchain. Em vez de gerenciar tudo manualmente, ele organiza o manifesto e a compila\u00e7\u00e3o. Crie um projeto novo dentro do diret\u00f3rio de estudos:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">mkdir OlaLinux\ncd OlaLinux\nswift package init --name OlaLinux --type executable\nswift run OlaLinux<\/code><\/pre>\n<p>O modelo inicial j\u00e1 imprime uma sauda\u00e7\u00e3o. Na toolchain Swift 6.3.3 testada nesta revis\u00e3o, <code data-no-translation=\"\">Package.swift<\/code> \u00e9 o manifesto e <code data-no-translation=\"\">Sources\/OlaLinux\/OlaLinux.swift<\/code> \u00e9 o ponto de entrada. Confira a estrutura criada pela sua vers\u00e3o antes de editar arquivos. O <a href=\"https:\/\/www.swift.org\/getting-started\/cli-swiftpm\/\">guia oficial de ferramentas de linha de comando<\/a> explica esse fluxo.<\/p>\n<p>Substitua o conte\u00fado de <code data-no-translation=\"\">Sources\/OlaLinux\/OlaLinux.swift<\/code> pelo exemplo abaixo. Ele aceita um nome no terminal e usa LinuxPro quando nenhum argumento \u00e9 informado:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-swift\" data-no-translation=\"\">@main\nstruct OlaLinux {\n    static func saudacao(para pessoa: String) -&gt; String {\n        return \"Ol\u00e1, \\(pessoa)! Swift est\u00e1 rodando no Linux.\"\n    }\n\n    static func main() {\n        let nome = CommandLine.arguments.dropFirst().first ?? \"LinuxPro\"\n        print(saudacao(para: nome))\n    }\n}<\/code><\/pre>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">swift run OlaLinux\nswift run OlaLinux Nilton<\/code><\/pre>\n<p>As mensagens esperadas s\u00e3o, respectivamente:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-text\" data-no-translation=\"\">Ol\u00e1, LinuxPro! Swift est\u00e1 rodando no Linux.\nOl\u00e1, Nilton! Swift est\u00e1 rodando no Linux.<\/code><\/pre>\n<p>O marcador <code data-no-translation=\"\">@main<\/code> define o ponto de entrada, que chama <code data-no-translation=\"\">main()<\/code>. Neste c\u00f3digo, <code data-no-translation=\"\">let<\/code> declara um valor que n\u00e3o ser\u00e1 reatribu\u00eddo. <code data-no-translation=\"\">CommandLine.arguments<\/code> cont\u00e9m os argumentos do processo; <code data-no-translation=\"\">dropFirst()<\/code> pula o nome do execut\u00e1vel e <code data-no-translation=\"\">first<\/code> obt\u00e9m o pr\u00f3ximo item, se existir. O operador <code data-no-translation=\"\">??<\/code> fornece o valor padr\u00e3o. A fun\u00e7\u00e3o recebe um nome e devolve a mensagem usando interpola\u00e7\u00e3o de strings.<\/p>\n<p>Para estudar a sintaxe com mais calma, siga o <a href=\"https:\/\/docs.swift.org\/swift-book\/documentation\/the-swift-programming-language\/guidedtour\/\">tour oficial da linguagem Swift<\/a>. Para uma CLI com op\u00e7\u00f5es, ajuda e valida\u00e7\u00e3o de entradas, o pr\u00f3ximo passo \u00e9 o <a href=\"https:\/\/github.com\/apple\/swift-argument-parser\">Swift Argument Parser<\/a>; n\u00e3o precisamos adicionar depend\u00eancias para esta primeira sauda\u00e7\u00e3o.<\/p>\n<h2>Adicione um teste automatizado<\/h2>\n<p>O modelo testado tamb\u00e9m criou uma pasta de testes. Substitua <code data-no-translation=\"\">Tests\/OlaLinuxTests\/OlaLinuxTests.swift<\/code> pelo exemplo abaixo, que verifica a mensagem produzida pela fun\u00e7\u00e3o sem depender da sa\u00edda do terminal:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-swift\" data-no-translation=\"\">import Testing\n@testable import OlaLinux\n\n@Test func saudacaoIncluiNome() {\n    #expect(OlaLinux.saudacao(para: \"Nilton\") ==\n        \"Ol\u00e1, Nilton! Swift est\u00e1 rodando no Linux.\")\n}<\/code><\/pre>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">swift test<\/code><\/pre>\n<p>A anota\u00e7\u00e3o <code data-no-translation=\"\">@Test<\/code> identifica o teste e <code data-no-translation=\"\">#expect<\/code> confere o resultado. Se voc\u00ea mudar a sauda\u00e7\u00e3o, atualize a expectativa conscientemente; uma falha deve provocar investiga\u00e7\u00e3o, n\u00e3o ser escondida. O <code data-no-translation=\"\">@testable import<\/code> permite testar a l\u00f3gica interna deste m\u00f3dulo.<\/p>\n<h2>Gere a vers\u00e3o release e fa\u00e7a um teste r\u00e1pido<\/h2>\n<p>Dentro da pasta que cont\u00e9m <code data-no-translation=\"\">Package.swift<\/code>, compile a configura\u00e7\u00e3o release e execute o resultado:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">swift build -c release\n.build\/release\/OlaLinux Nilton<\/code><\/pre>\n<p>Um teste simples de sa\u00edda ajuda a detectar regress\u00f5es ao modificar esse exemplo:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">test \"$(.build\/release\/OlaLinux Nilton)\" =   \"Ol\u00e1, Nilton! Swift est\u00e1 rodando no Linux.\" &amp;&amp; echo \"OK\"<\/code><\/pre>\n<p>Isso \u00e9 apenas uma verifica\u00e7\u00e3o b\u00e1sica do programa, n\u00e3o uma su\u00edte completa de testes. Em um projeto maior, separe a l\u00f3gica em m\u00f3dulos test\u00e1veis. Para publicar o projeto no Git, mantenha o c\u00f3digo e o manifesto; a pasta de resultados <code data-no-translation=\"\">.build\/<\/code> n\u00e3o precisa entrar no reposit\u00f3rio.<\/p>\n<h2>Alternativa: experimente usando Docker<\/h2>\n<p>Se o Docker j\u00e1 est\u00e1 instalado, a <a href=\"https:\/\/www.swift.org\/install\/linux\/docker\/\">imagem oficial do Swift<\/a> permite testar sem instalar a toolchain no host. Este exemplo fixa a vers\u00e3o usada na revis\u00e3o e n\u00e3o precisa de modo privilegiado:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">docker run --rm swift:6.3.3 swift --version\n\ncd \"$HOME\/projetos\/swift-linuxpro\"\ndocker run --rm   --mount \"type=bind,source=$PWD,target=\/work,readonly\"   -w \/work swift:6.3.3 swift hello.swift<\/code><\/pre>\n<p>A montagem \u00e9 somente leitura porque esse comando apenas executa o script. A primeira chamada pode baixar a imagem. Para aprender o b\u00e1sico de containers, veja tamb\u00e9m <a href=\"\/es\/2017\/08\/curso-de-docker-gratis\/\">o curso de Docker<\/a>. N\u00e3o misture sem cuidado arquivos de build gerados em containers com os do seu host.<\/p>\n<h2>Editor e problemas comuns<\/h2>\n<p>No VS Code, instale a extens\u00e3o Swift e abra a pasta do projeto, n\u00e3o apenas um arquivo avulso. Ela integra navega\u00e7\u00e3o de c\u00f3digo, depura\u00e7\u00e3o e recursos de testes; o <a href=\"https:\/\/www.swift.org\/documentation\/articles\/getting-started-with-vscode-swift.html\">guia oficial de configura\u00e7\u00e3o<\/a> detalha o ambiente. O blog tamb\u00e9m tem um guia de <a href=\"\/es\/2017\/05\/instalando-visualstudio-no-ubuntu\/\">VS Code no Ubuntu<\/a>.<\/p>\n<ul>\n<li><strong>swift: command not found:<\/strong> carregue novamente o arquivo <code data-no-translation=\"\">env.sh<\/code> do Swiftly, execute <code data-no-translation=\"\">hash -r<\/code> no Bash e confira <code data-no-translation=\"\">command -v swift<\/code>.<\/li>\n<li><strong>Biblioteca ou linker ausente:<\/strong> leia a mensagem e as depend\u00eancias indicadas para sua distribui\u00e7\u00e3o. A <a href=\"https:\/\/www.swift.org\/install\/linux\/tarball\/\">documenta\u00e7\u00e3o de instala\u00e7\u00e3o manual<\/a> lista requisitos por sistema; n\u00e3o crie links simb\u00f3licos aleat\u00f3rios entre vers\u00f5es de bibliotecas.<\/li>\n<li><strong>Package.swift n\u00e3o encontrado:<\/strong> execute <code data-no-translation=\"\">pwd<\/code> e <code data-no-translation=\"\">ls<\/code>; os comandos de pacote devem partir da pasta <code data-no-translation=\"\">OlaLinux<\/code>.<\/li>\n<li><strong>Erro envolvendo @main:<\/strong> este exemplo usa c\u00f3digo no topo de <code data-no-translation=\"\">main.swift<\/code>. N\u00e3o adicione ao mesmo execut\u00e1vel um segundo ponto de entrada com <code data-no-translation=\"\">@main<\/code>.<\/li>\n<li><strong>Vers\u00e3o inesperada:<\/strong> use <code data-no-translation=\"\">type -a swift<\/code> para descobrir se outra instala\u00e7\u00e3o est\u00e1 antes do Swiftly no PATH. N\u00e3o apague uma toolchain antiga antes de identificar qual caminho est\u00e1 em uso.<\/li>\n<\/ul>\n<h2>O registro de 2017 e o pr\u00f3ximo passo<\/h2>\n<p>O tutorial original usava Swift 3.1.1, Ubuntu 16.04 e extra\u00e7\u00e3o manual da toolchain em <code data-no-translation=\"\">\/usr\/local<\/code>. Esse \u00e9 o contexto hist\u00f3rico, n\u00e3o a receita recomendada nesta revis\u00e3o. Downloads manuais continuam dispon\u00edveis, mas exigem escolher a toolchain correta e suas depend\u00eancias; o Swiftly simplifica esse gerenciamento.<\/p>\n<p>Voc\u00ea agora tem tr\u00eas caminhos claros: executar um arquivo para experimentar, usar <code data-no-translation=\"\">swiftc<\/code> para gerar um bin\u00e1rio e usar SwiftPM para organizar um projeto. Como exerc\u00edcio, fa\u00e7a a sauda\u00e7\u00e3o receber um segundo argumento e trate a aus\u00eancia desse valor. Depois compare a experi\u00eancia com <a href=\"\/es\/2017\/04\/python-do-basico-ao-profissional\/\">Python<\/a> e com o nosso <a href=\"\/es\/2017\/05\/linguagens-de-programacao\/\">panorama de linguagens de programa\u00e7\u00e3o<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Quer experimentar Swift no Linux sem come\u00e7ar por um projeto enorme? Vamos instalar a linguagem, executar um Hello World, gerar um bin\u00e1rio e montar uma pequena ferramenta de terminal com argumentos. O objetivo \u00e9 sair deste artigo com c\u00f3digo funcionando &#8230; <a title=\"Swift en Linux: instalaci\u00f3n, Hola Mundo y primer proyecto\" class=\"read-more\" href=\"https:\/\/www.linuxpro.com.br\/es\/2017\/05\/instalando-swift-no-linux\/\" aria-label=\"Read more about Swift no Linux: instala\u00e7\u00e3o, Hello World e primeiro projeto\">Read more<\/a><\/p>","protected":false},"author":0,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,66,3],"tags":[4,67,5],"class_list":["post-126","post","type-post","status-publish","format-standard","hentry","category-linux","category-swift","category-ubuntu","tag-linux","tag-swift","tag-ubuntu"],"_links":{"self":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/126","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/comments?post=126"}],"version-history":[{"count":6,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/126\/revisions"}],"predecessor-version":[{"id":1592,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/126\/revisions\/1592"}],"wp:attachment":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/media?parent=126"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/categories?post=126"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/tags?post=126"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}