Estoy intentando obtener la entrada del teclado para una aplicación de línea de comandos para el nuevo lenguaje de programación Swift de Apple.
He escaneado los documentos en vano.
import Foundation
println("What is your name?")
???
¿Algunas ideas?
swift
macos
cocoa
command-line
Chalkers
fuente
fuente
Me las arreglé para resolverlo sin bajar a C:
Mi solución es la siguiente:
Las versiones más recientes de Xcode necesitan un encasillado explícito (funciona en Xcode 6.4):
fuente
var input = NSString(data: NSFileHandle.fileHandleWithStandardInput().availableData, encoding:NSUTF8StringEncoding)
string.stringByTrimmingCharactersInSet(NSCharacterSet.newlineCharacterSet())
En realidad, no es tan fácil, tienes que interactuar con la API de C. No hay alternativa a
scanf
. He construido un pequeño ejemplo:main.swift
UserInput.c
cliinput-Bridging-Header.h
fuente
editar A partir de Swift 2.2, la biblioteca estándar incluye
readLine
. También señalaré que Swift cambió a comentarios de documentos de rebajas. Dejando mi respuesta original para el contexto histórico.Solo para completar, aquí hay una implementación de Swift
readln
que he estado usando. Tiene un parámetro opcional para indicar el número máximo de bytes que desea leer (que puede ser o no la longitud de la Cadena).Esto también demuestra el uso adecuado de los comentarios de swiftdoc: Swift generará un archivo <project> .swiftdoc y Xcode lo usará.
fuente
En general, la función readLine () se usa para escanear la entrada desde la consola. Pero no funcionará en un proyecto iOS normal hasta que agregue una "herramienta de línea de comandos" .
La mejor forma de realizar la prueba es:
1. Crea un archivo macOS
2. Utilice la función readLine () para escanear una cadena opcional desde la consola
Salida:
fuente
Otra alternativa es vincular libedit para la edición de línea adecuada (teclas de flecha, etc.) y soporte de historial opcional. Quería esto para un proyecto que estoy comenzando y armé un ejemplo básico de cómo lo configuré .
Uso de Swift
Contenedor de ObjC para exponer libedit
fuente
A continuación, se muestra un ejemplo simple de cómo recibir información del usuario en una aplicación basada en consola: Puede usar readLine (). Tome la entrada de la consola para el primer número y luego presione enter. Después de eso, tome la entrada para el segundo número como se muestra en la imagen a continuación:
fuente
Muchas respuestas obsoletas a esta pregunta. A partir de Swift 2+, la biblioteca estándar de Swift contiene la función readline () . Devolverá un Opcional, pero solo será nulo si se ha alcanzado EOF, lo que no sucederá cuando se obtenga una entrada desde el teclado, por lo que se puede desenvolver con seguridad por la fuerza en esos escenarios. Si el usuario no ingresa nada, su valor (sin empaquetar) será una cadena vacía. Aquí hay una pequeña función de utilidad que usa la recursividad para avisar al usuario hasta que se haya ingresado al menos un carácter:
Tenga en cuenta que el uso de enlace opcional (si deja input = readLine ()) para verificar si se ingresó algo como se propuso en otras respuestas no tendrá el efecto deseado, ya que nunca será nulo y al menos "" al aceptar la entrada del teclado.
Esto no funcionará en un patio de juegos ni en ningún otro entorno donde no tenga acceso al símbolo del sistema. También parece tener problemas en la línea de comandos REPL.
fuente
Lo juro por Dios ... la solución a este problema absolutamente básico se me escapó durante AÑOS. Es TAN simple ... pero hay mucha información vaga / mala por ahí; Ojalá pueda salvar a alguien de algunos de los agujeros de conejo sin fondo que terminé ...
Entonces, obtengamos una "cadena" del "usuario" a través de "la consola", a través
stdin
, ¿de acuerdo ?si lo desea SIN la nueva línea final, simplemente agregue ...
Ta Da!
♥ ⱥ ᏪℯⅩfuente
Como no había soluciones sofisticadas para este problema, hice una pequeña clase para leer y analizar la entrada estándar en Swift. Puedes encontrarlo aquí .
Ejemplo
Analizar:
Tú lo haces:
fuente
antes de
*******************.
Corrección
fuente
Esto funciona en xCode v6.2, creo que es Swift v1.2
fuente
Si desea leer una cadena separada por espacios e inmediatamente dividir la cadena en una matriz, puede hacer esto:
var arr = readLine()!.characters.split(" ").map(String.init)
p.ej.
fuente
Cuando la función readLine () se ejecuta en Xcode, la consola de depuración espera la entrada. El resto del código se reanudará después de que se complete la entrada.
fuente
La respuesta mejor clasificada a esta pregunta sugiere usar el método readLine () para tomar la entrada del usuario desde la línea de comando. Sin embargo, quiero señalar que debes usar el! operador al llamar a este método para devolver una cadena en lugar de un opcional:
fuente
readLine()
devuelve opcional por una razón, por lo tanto, no es seguro desenvolver a la fuerza y realmente no agrega nada al ejemplo.Swift 5: si continuamente desea ingresar desde el teclado, sin finalizar el programa, como un flujo de entrada, siga los pasos a continuación:
Crear nuevo proyecto de tipo comnnad line tool
Agregue el siguiente código en el archivo main.swift:
fuente
Probé esto en ObjC, y tal vez sea útil.
fuente
Solo quería comentar (no tengo suficientes repeticiones) sobre la implementación de xenadu, porque
CChar
en OS X lo esInt8
, y a Swift no le gusta en absoluto cuando agregas a la matriz cuandogetchar()
devuelve partes de UTF-8, o cualquier otra cosa por encima de 7 bits.Estoy usando una matriz de en su
UInt8
lugar, y funciona muy bien yString.fromCString
convierte elUInt8
en UTF-8 muy bien.Sin embargo, así es como lo hice.
fuente
Ahora he podido obtener la entrada del teclado en Swift usando lo siguiente:
En mi archivo main.swift, declaré una variable i y le asigné la función GetInt () que definí en el Objetivo C. A través de un encabezado puente donde declaré el prototipo de función para GetInt, pude vincularlo a main.swift. Aquí están los archivos:
main.swift:
Encabezado puente:
obj.m:
En obj.m es posible incluir la salida y entrada estándar de c, stdio.h, así como la biblioteca estándar de c stdlib.h que le permite programar en C en Objective-C, lo que significa que no es necesario incluir un archivo realmente rápido como user.c o algo así.
Espero poder ayudar
Editar: No es posible obtener una entrada de cadena a través de C porque aquí estoy usando CInt -> el tipo entero de C y no de Swift. No existe un tipo Swift equivalente para el carácter C *. Por lo tanto, String no se puede convertir en string. Pero hay suficientes soluciones por aquí para obtener la entrada de String.
Raul
fuente