Estou tentando obter a entrada do teclado para um aplicativo de linha de comando para a nova linguagem de programação Swift da Apple.
Eu examinei os documentos sem sucesso.
import Foundation
println("What is your name?")
???
Alguma ideia?
swift
macos
cocoa
command-line
Chalkers
fonte
fonte
Eu consegui descobrir sem cair no C:
Minha solução é a seguinte:
Versões mais recentes do Xcode precisam de um typecast explícito (funciona no Xcode 6.4):
fonte
var input = NSString(data: NSFileHandle.fileHandleWithStandardInput().availableData, encoding:NSUTF8StringEncoding)
string.stringByTrimmingCharactersInSet(NSCharacterSet.newlineCharacterSet())
Na verdade não é tão fácil, você tem que interagir com a API C. Não há alternativa para
scanf
. Eu construí um pequeno exemplo:main.swift
UserInput.c
cliinput-Bridging-Header.h
fonte
editar A partir do Swift 2.2, a biblioteca padrão inclui
readLine
. Também observarei que o Swift mudou para comentários de documentos em markdown. Deixando minha resposta original para o contexto histórico.Apenas para completar, aqui está uma implementação do Swift
readln
que venho usando. Possui um parâmetro opcional para indicar o número máximo de bytes que você deseja ler (que pode ou não ser o comprimento da String).Isso também demonstra o uso adequado dos comentários do swiftdoc - o Swift irá gerar um arquivo <project> .swiftdoc e o Xcode irá usá-lo.
fonte
Outra alternativa é vincular libedit para edição de linha apropriada (teclas de seta, etc.) e suporte de histórico opcional. Eu queria isso para um projeto que estou começando e montei um exemplo básico de como configurá-lo .
Uso do Swift
Wrapper ObjC para expor libedit
fonte
Em geral, a função readLine () é usada para verificar a entrada do console. Mas não funcionará em projetos iOS normais até ou a menos que você adicione "ferramenta de linha de comando" .
A melhor maneira de testar, você pode fazer:
1. Crie um arquivo macOS
2. Use a função readLine () para verificar String opcional do console
Resultado :
fonte
Aqui está um exemplo simples de obtenção de entrada do usuário em um aplicativo baseado em console: Você pode usar readLine (). Faça a entrada do console para o primeiro número e pressione enter. Depois disso, insira o segundo número, conforme mostrado na imagem abaixo:
fonte
Juro por Deus ... a solução para este problema absolutamente básico me escapou por ANOS. É TÃO simples ... mas há tantas informações vagas / ruins por aí; espero poder salvar alguém de algumas das tocas de coelho sem fundo em que acabei ...
Então, vamos obter uma "string" de "o usuário" por meio de "o console", por meio de
stdin
, vamos ?se você quiser SEM a nova linha final, basta adicionar ...
Ta Da!
♥ ⱥ ᏪℯⅩfonte
Muitas respostas desatualizadas para esta pergunta. A partir do Swift 2+, a biblioteca padrão do Swift contém a função readline () . Ele retornará um opcional, mas só será nulo se EOF for atingido, o que não acontecerá ao obter a entrada do teclado para que possa ser desembrulhado à força com segurança nesses cenários. Se o usuário não inserir nada, seu valor (desembrulhado) será uma string vazia. Aqui está uma pequena função de utilidade que usa recursão para alertar o usuário até que pelo menos um caractere tenha sido inserido:
Observe que o uso de ligação opcional (if let input = readLine ()) para verificar se algo foi inserido como proposto em outras respostas não terá o efeito desejado, pois nunca será nulo e pelo menos "" ao aceitar a entrada do teclado.
Isso não funcionará em um Playground ou em qualquer outro ambiente onde você não tenha acesso ao prompt de comando. Parece haver problemas no REPL da linha de comando também.
fonte
Como não havia soluções sofisticadas para esse problema, fiz uma pequena classe para ler e analisar a entrada padrão em Swift. Você pode encontrar aqui .
Exemplo
Para analisar:
Você faz:
fonte
Antes
*******************.
Correção
fonte
Isso funciona no xCode v6.2, acho que é o Swift v1.2
fonte
Se quiser ler uma string separada por espaço e dividir imediatamente a string em uma matriz, você pode fazer o seguinte:
var arr = readLine()!.characters.split(" ").map(String.init)
por exemplo.
fonte
Quando a função readLine () é executada no Xcode, o console de depuração espera pela entrada. O resto do código será retomado após a entrada ser feita.
fonte
A resposta mais bem classificada para essa pergunta sugere o uso do método readLine () para obter a entrada do usuário a partir da linha de comando. No entanto, quero observar que você precisa usar o! operador ao chamar este método para retornar uma string em vez de um opcional:
fonte
readLine()
retorna opcional por uma razão, portanto, não é seguro forçar o desempacotamento e realmente não adiciona nada ao exemplo.Swift 5: se você deseja inserir continuamente a partir do teclado, sem encerrar o programa, como um fluxo de entrada, use as etapas abaixo:
Criar novo projeto do tipo ferramenta de linha comnnad
Adicione o código abaixo no arquivo main.swift:
fonte
Eu testei isso no ObjC, e talvez isso seja útil.
fonte
Eu só queria comentar (não tenho representantes suficientes) sobre a implementação do xenadu, porque
CChar
no OS X éInt8
, e o Swift não gosta nada quando você adiciona ao array quandogetchar()
retorna partes de UTF-8, ou qualquer outra coisa acima de 7 bits.Estou usando um array de
UInt8
, em vez disso, funciona muito bem eString.fromCString
converteUInt8
em UTF-8 muito bem.Porém foi assim que eu fiz
fonte
Agora consigo obter entrada de teclado em Swift usando o seguinte:
Em meu arquivo main.swift, declarei uma variável i e atribuí a ela a função GetInt () que defini no Objetivo C. Por meio de um cabeçalho chamado Bridging, onde declarei o protótipo de função para GetInt, pude vincular a main.swift. Aqui estão os arquivos:
main.swift:
Cabeçalho de ponte:
obj.m:
Em obj.m é possível incluir a saída e entrada padrão c, stdio.h, bem como a biblioteca padrão c stdlib.h que permite programar em C em Objective-C, o que significa que não há necessidade de incluir um arquivo rápido real como user.c ou algo parecido.
Espero poder ajudar,
Edit: Não é possível obter a entrada String por meio de C porque aqui estou usando o CInt -> o tipo inteiro de C e não de Swift. Não existe um tipo Swift equivalente para o C char *. Portanto, String não é conversível em string. Mas existem soluções bastante por aqui para obter entrada String.
Raul
fonte