{"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-22T21:37:47","modified_gmt":"2026-09-23T00:37:47","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 en mayo de 2017 para Swift 3.1 en Ubuntu; esta gu\u00eda se actualiz\u00f3 en 22 de septiembre de 2026 para Swift 6.4.0, instalado por el m\u00e9todo oficial con Swiftly, manteniendo la URL y la fecha hist\u00f3rica.<\/div>\n<p>\u00bfQuieres probar Swift en Linux sin empezar por un proyecto enorme? Vamos a instalar el lenguaje por el m\u00e9todo oficial de swift.org, ejecutar un Hello World, generar un binario y montar una peque\u00f1a herramienta de terminal con argumentos. El objetivo es salir de este art\u00edculo con c\u00f3digo funcionando y entender la diferencia entre <code data-no-translation=\"\">swift<\/code>, <code data-no-translation=\"\">swiftc<\/code> y Swift Package Manager.<\/p>\n<p><!-- more --><\/p>\n<h2>Antes de instalar: el lenguaje Swift no es OpenStack Swift<\/h2>\n<p>Este tutorial trata sobre el lenguaje de programaci\u00f3n. El <a href=\"https:\/\/packages.debian.org\/bookworm\/swift\">paquete llamado swift en Debian<\/a> pertenece a OpenStack, un sistema de almacenamiento de objetos. No lo uses <code data-no-translation=\"\">apt install swift<\/code> como atajo para instalar el compilador de este art\u00edculo: consulta siempre la descripci\u00f3n del paquete.<\/p>\n<p>Usa una distribuci\u00f3n y arquitectura presentes en las opciones oficiales de <a href=\"https:\/\/www.swift.org\/install\/linux\/\">instalaci\u00f3n de Swift en Linux<\/a>. Los ejemplos de preparaci\u00f3n siguientes usan Ubuntu\/Debian y Bash. Comprueba la distribuci\u00f3n y la arquitectura antes de empezar:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">cat \/etc\/os-release\nuname -m<\/code><\/pre>\n<p>Para empezar, reserva una carpeta en tu usuario y ten acceso a internet. Las dependencias del sistema requieren sudo; Swiftly, la toolchain y los comandos de compilaci\u00f3n quedan en tu usuario y no necesitan root.<\/p>\n<h2>Instala Swift 6.4 con Swiftly<\/h2>\n<p>Swiftly es el instalador oficial: descarga la toolchain, verifica su firma y permite alternar entre versiones. En la consulta de 22\/09\/2026, la <a href=\"https:\/\/www.swift.org\/install\/linux\/\">p\u00e1gina oficial<\/a> indicaba <strong>Swift 6.4.0<\/strong>, publicado el 15 de septiembre de 2026. Prepara las herramientas b\u00e1sicas:<\/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>Descarga el instalador indicado por el sitio, la firma y las claves del proyecto. El nombre del archivo usa la arquitectura de la m\u00e1quina (<code data-no-translation=\"\">x86_64<\/code> o <code data-no-translation=\"\">aarch64<\/code>) y siempre apunta a la versi\u00f3n actual de Swiftly:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">mkdir -p \"$HOME\/Downloads\/swiftly-linuxpro\"\ncd \"$HOME\/Downloads\/swiftly-linuxpro\"\n\ncurl -O https:\/\/download.swift.org\/swiftly\/linux\/swiftly-$(uname -m).tar.gz\ncurl -O https:\/\/download.swift.org\/swiftly\/linux\/swiftly-$(uname -m).tar.gz.sig\ncurl --compressed https:\/\/www.swift.org\/keys\/all-keys.asc | gpg --import -\ngpg --verify swiftly-$(uname -m).tar.gz.sig swiftly-$(uname -m).tar.gz<\/code><\/pre>\n<p>La salida debe contener <code data-no-translation=\"\">Good signature from \"Swift Automatic Signing Key<\/code>. El aviso de que la clave no est\u00e1 certificada por una firma de confianza es normal cuando la acabas de importar. Si aparece <code data-no-translation=\"\">BAD signature<\/code>, para: no extraigas ni ejecutes el archivo. Con la firma confirmada, ejecuta exactamente el comando de la p\u00e1gina oficial:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">tar zxf swiftly-$(uname -m).tar.gz &amp;&amp; \\\n.\/swiftly init --quiet-shell-followup &amp;&amp; \\\n. \"${SWIFTLY_HOME_DIR:-$HOME\/.local\/share\/swiftly}\/env.sh\" &amp;&amp; \\\nhash -r<\/code><\/pre>\n<p>O <code data-no-translation=\"\">init<\/code> descarga poco m\u00e1s de 1 GB, comprueba la firma del toolchain y define Swift 6.4.0 como predeterminado. Al final, imprime un comando <code data-no-translation=\"\">apt-get<\/code> con las dependencias que faltan en el sistema. <strong>No te saltes este paso:<\/strong> en Ubuntu 24.04 limpio que usamos en la prueba, <code data-no-translation=\"\">swift<\/code> fallaba con <code data-no-translation=\"\">libncurses.so.6: cannot open shared object file<\/code> hasta instalar la lista indicada, que fue esta:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">sudo apt-get -y install binutils git unzip zip gnupg2 libc6-dev libcurl4-openssl-dev \\\n  libedit2 libgcc-13-dev libpython3-dev libstdc++-13-dev libxml2-dev libncurses-dev \\\n  libz3-dev pkg-config tzdata zlib1g-dev<\/code><\/pre>\n<p>En otra distribuci\u00f3n o versi\u00f3n, usa la lista que tu <code data-no-translation=\"\">swiftly init<\/code> muestre, no esta. Despu\u00e9s comprueba:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">swift --version\nswiftc --version<\/code><\/pre>\n<p>La salida debe mencionar <code data-no-translation=\"\">Swift version 6.4.0<\/code>. El archivo <code data-no-translation=\"\">env.sh<\/code> ajusta la sesi\u00f3n actual; <code data-no-translation=\"\">init<\/code> tambi\u00e9n configura tu shell para los pr\u00f3ximos terminales. Los detalles de cada paso est\u00e1n en la gu\u00eda oficial <a href=\"https:\/\/www.swift.org\/install\/linux\/swiftly\/\">Getting Started with Swiftly on Linux<\/a>.<\/p>\n<h2>Hello World b\u00e1sico: un archivo y una l\u00ednea<\/h2>\n<p>Comience fuera de la carpeta del instalador. Cree un directorio de estudio y un archivo llamado <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>La salida esperada es:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-text\" data-no-translation=\"\">Hello, world!<\/code><\/pre>\n<p>Aqu\u00ed, <code data-no-translation=\"\">print<\/code> escribe un mensaje en la salida est\u00e1ndar. La llamada <code data-no-translation=\"\">swift hello.swift<\/code> ejecuta el archivo sin que tengas que gestionar manualmente un ejecutable. Es una buena v\u00eda para peque\u00f1os experimentos; no es necesario crear un paquete para cada prueba.<\/p>\n<h2>Compila el mismo programa con swiftc<\/h2>\n<p>Ahora genera un ejecutable con un nombre 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>El mensaje es el mismo, pero el flujo ha cambiado: primero has compilado; despu\u00e9s lo has ejecutado <code data-no-translation=\"\">.\/hello<\/code>. Cuando modifiques el c\u00f3digo, vuelve a ejecutar el compilador para actualizar el binario. El prefijo <code data-no-translation=\"\">.\/<\/code> indica que el archivo est\u00e1 en el directorio actual.<\/p>\n<p>Un binario compilado en tu equipo no es autom\u00e1ticamente compatible con todo Linux. La arquitectura, las bibliotecas y el runtime del entorno de destino importan. Para una distribuci\u00f3n m\u00e1s controlada, estudia el <a href=\"https:\/\/www.swift.org\/documentation\/articles\/static-linux-getting-started.html\">Swift SDK for Static Linux<\/a>; esto es un paso posterior al Hola Mundo.<\/p>\n<h2>Crea una herramienta con Swift Package Manager<\/h2>\n<p>Cuando el c\u00f3digo gane m\u00e1s archivos y dependencias, usa Swift Package Manager, que acompa\u00f1a a la toolchain. En lugar de gestionarlo todo manualmente, organiza el manifiesto y la compilaci\u00f3n. Crea un proyecto nuevo dentro del directorio de estudio:<\/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>La plantilla inicial ya imprime un saludo. En la toolchain Swift 6.4.0 probada en esta revisi\u00f3n, <code data-no-translation=\"\">Package.swift<\/code> es el manifiesto y <code data-no-translation=\"\">Sources\/OlaLinux\/OlaLinux.swift<\/code> es el punto de entrada. Comprueba la estructura creada por tu versi\u00f3n antes de editar archivos. La <a href=\"https:\/\/www.swift.org\/getting-started\/cli-swiftpm\/\">gu\u00eda oficial de herramientas de l\u00ednea de comandos<\/a> explica este flujo.<\/p>\n<p>Sustituye el contenido de <code data-no-translation=\"\">Sources\/OlaLinux\/OlaLinux.swift<\/code> por el ejemplo de abajo. Acepta un nombre en el terminal y usa LinuxPro cuando no se pasa ning\u00fan argumento:<\/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>Los mensajes esperados son, 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>El marcador <code data-no-translation=\"\">@main<\/code> define el punto de entrada, que llama <code data-no-translation=\"\">main()<\/code>. En este c\u00f3digo, <code data-no-translation=\"\">let<\/code> declara un valor que no se va a reasignar. <code data-no-translation=\"\">CommandLine.arguments<\/code> contiene los argumentos del proceso; <code data-no-translation=\"\">dropFirst()<\/code> salta el nombre del ejecutable y <code data-no-translation=\"\">first<\/code> obtiene el siguiente elemento, si existe. El operador <code data-no-translation=\"\">??<\/code> proporciona el valor por defecto. La funci\u00f3n recibe un nombre y devuelve el mensaje usando interpolaci\u00f3n de cadenas.<\/p>\n<p>Para estudiar la sintaxis con m\u00e1s calma, sigue el <a href=\"https:\/\/docs.swift.org\/swift-book\/documentation\/the-swift-programming-language\/guidedtour\/\">tour oficial del lenguaje Swift<\/a>. Para una CLI con opciones, ayuda y validaci\u00f3n de entradas, el siguiente paso es el <a href=\"https:\/\/github.com\/apple\/swift-argument-parser\">Swift Argument Parser<\/a>; no necesitamos a\u00f1adir dependencias para este primer saludo.<\/p>\n<h2>A\u00f1ade una prueba automatizada<\/h2>\n<p>La plantilla tambi\u00e9n cre\u00f3 una carpeta de pruebas. Sustituye <code data-no-translation=\"\">Tests\/OlaLinuxTests\/OlaLinuxTests.swift<\/code> por el ejemplo de abajo, que verifica el mensaje producido por la funci\u00f3n sin depender de la salida de la 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>La anotaci\u00f3n <code data-no-translation=\"\">@Test<\/code> identifica la prueba y <code data-no-translation=\"\">#expect<\/code> compara el resultado. Si cambias el saludo, actualiza la expectativa de forma consciente; un fallo debe provocar una investigaci\u00f3n, no ocultarse. El <code data-no-translation=\"\">@testable import<\/code> permite probar la l\u00f3gica interna de este m\u00f3dulo.<\/p>\n<h2>Genera la versi\u00f3n release y haz una prueba r\u00e1pida<\/h2>\n<p>Dentro de la carpeta que contiene <code data-no-translation=\"\">Package.swift<\/code>, compila la configuraci\u00f3n release y ejecuta el 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>Una sencilla prueba de salida ayuda a detectar regresiones al modificar este ejemplo:<\/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>Esto es solo una comprobaci\u00f3n b\u00e1sica del programa, no una suite completa de pruebas. En un proyecto m\u00e1s grande, separe la l\u00f3gica en m\u00f3dulos testeables. Para publicar el proyecto en Git, mantenga el c\u00f3digo y el manifiesto; la carpeta de resultados <code data-no-translation=\"\">.build\/<\/code> no necesita entrar en el repositorio.<\/p>\n<h2>Alternativa: prueba usando Docker<\/h2>\n<p>Si Docker ya est\u00e1 instalado, la <a href=\"https:\/\/www.swift.org\/install\/linux\/docker\/\">imagen oficial de Swift<\/a> permite probar sin instalar la toolchain en el host. Este ejemplo fija la versi\u00f3n usada en la revisi\u00f3n y no necesita modo privilegiado:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">docker run --rm swift:6.4.0 swift --version\n\ncd \"$HOME\/projetos\/swift-linuxpro\"\ndocker run --rm \\\n  --mount \"type=bind,source=$PWD,target=\/work,readonly\" \\\n  -w \/work swift:6.4.0 swift hello.swift<\/code><\/pre>\n<p>El montaje es solo de lectura porque este comando solo ejecuta el script. La primera llamada puede descargar la imagen. Para aprender lo b\u00e1sico de containers, vea tambi\u00e9n <a href=\"\/es\/2017\/08\/curso-de-docker-gratis\/\">el curso de Docker<\/a>.  . No mezcle sin cuidado archivos de build generados en containers con los de su host.<\/p>\n<h2>Editor y problemas comunes<\/h2>\n<p>En VS Code, instale la extensi\u00f3n Swift y abra la carpeta del proyecto, no solo un archivo suelto. Integra navegaci\u00f3n de c\u00f3digo, depuraci\u00f3n y funciones de pruebas; la <a href=\"https:\/\/www.swift.org\/documentation\/articles\/getting-started-with-vscode-swift.html\">gu\u00eda oficial de configuraci\u00f3n<\/a> detalla el entorno. El blog tambi\u00e9n tiene una gu\u00eda de <a href=\"\/es\/2017\/05\/instalando-visualstudio-no-ubuntu\/\">VS Code en Ubuntu<\/a>.<\/p>\n<ul>\n<li><strong>swift: comando no encontrado<\/strong> vuelva a cargar el archivo <code data-no-translation=\"\">env.sh<\/code> de Swiftly, ejecute <code data-no-translation=\"\">hash -r<\/code> en Bash y compruebe <code data-no-translation=\"\">command -v swift<\/code>.<\/li>\n<li><strong>error while loading shared libraries:<\/strong> faltan las dependencias del sistema. Instala la lista que el <code data-no-translation=\"\">swiftly init<\/code> mostr\u00f3; la <a href=\"https:\/\/www.swift.org\/install\/linux\/tarball\/\">documentaci\u00f3n de instalaci\u00f3n manual<\/a> tambi\u00e9n lista requisitos por sistema. No crees enlaces simb\u00f3licos aleatorios entre versiones de bibliotecas.<\/li>\n<li><strong>Package.swift no encontrado:<\/strong> ejecute <code data-no-translation=\"\">pwd<\/code> e <code data-no-translation=\"\">ls<\/code>; los comandos de paquete deben partir desde la carpeta <code data-no-translation=\"\">OlaLinux<\/code>.<\/li>\n<li><strong>Error relacionado con @main:<\/strong> un ejecutable solo puede tener un punto de entrada. No mantengas un <code data-no-translation=\"\">main.swift<\/code> con c\u00f3digo en la parte superior junto al archivo que usa <code data-no-translation=\"\">@main<\/code>.<\/li>\n<li><strong>Versi\u00f3n inesperada:<\/strong> use <code data-no-translation=\"\">type -a swift<\/code> para descubrir si otra instalaci\u00f3n est\u00e1 antes de Swiftly en el PATH. No elimine una toolchain antigua antes de identificar qu\u00e9 ruta est\u00e1 en uso.<\/li>\n<\/ul>\n<h2>El registro de 2017 y el siguiente paso<\/h2>\n<p>El tutorial original usaba Swift 3.1.1, Ubuntu 16.04 y extracci\u00f3n manual de la toolchain en <code data-no-translation=\"\">\/usr\/local<\/code>. Ese es el contexto hist\u00f3rico, no la receta recomendada hoy. Las descargas manuales siguen disponibles, pero exigen elegir la toolchain correcta y sus dependencias; Swiftly simplifica esa gesti\u00f3n y es el primer m\u00e9todo indicado por swift.org.<\/p>\n<p>Ahora tiene tres caminos claras: ejecutar un archivo para probar, usar <code data-no-translation=\"\">swiftc<\/code> para generar un binario y usar SwiftPM para organizar un proyecto. Como ejercicio, haga que el saludo reciba un segundo argumento y trate la ausencia de ese valor. Despu\u00e9s compare la experiencia con <a href=\"\/es\/2017\/04\/python-do-basico-ao-profissional\/\">Python<\/a>, con el <a href=\"\/es\/2017\/05\/instalando-golang-no-linux\/\">Go en Linux<\/a> y con nuestro <a href=\"\/es\/2017\/05\/linguagens-de-programacao\/\">panorama de lenguajes de programaci\u00f3n<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>\u00bfQuieres probar Swift en Linux sin empezar con un proyecto enorme? Vamos a instalar el lenguaje siguiendo el m\u00e9todo oficial de swift.org, ejecutar un Hello World, generar un binario y montar una peque\u00f1a herramienta de terminal con argumentos. El objetivo es salir \u2026 <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=\"Leer m\u00e1s sobre Swift no Linux: instala\u00e7\u00e3o, Hello World e primeiro projeto\">Leer m\u00e1s<\/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":7,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/126\/revisions"}],"predecessor-version":[{"id":1625,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/126\/revisions\/1625"}],"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}]}}