16 ответов:
правильный способ сделать это-использовать
readLine, из стандартной библиотеки Swift.пример:
let response = readLine()даст вам необязательное значение, содержащее введенный текст.
мне удалось выяснить это, не опускаясь в C:
мое решение заключается в следующем:
func input() -> String { var keyboard = NSFileHandle.fileHandleWithStandardInput() var inputData = keyboard.availableData return NSString(data: inputData, encoding:NSUTF8StringEncoding)! }более поздние версии Xcode нуждаются в явной типизации (работает в Xcode 6.4):
func input() -> String { var keyboard = NSFileHandle.fileHandleWithStandardInput() var inputData = keyboard.availableData return NSString(data: inputData, encoding:NSUTF8StringEncoding)! as String }
это на самом деле не так просто, вы должны взаимодействовать с C API. Альтернативы
scanf. Я построил небольшой пример:главная.Свифт
import Foundation var output: CInt = 0 getInput(&output) println(output)
иначе, если один операнд.c#include <stdio.h> void getInput(int *output) { scanf("%i", output); }
cliinput-Bridging-Header.hvoid getInput(int *output);
edit начиная с Swift 2.2 стандартная библиотека включает
readLine. Я также отмечу, что Swift переключился на комментарии к документу markdown. Оставляя мой оригинальный ответ для исторического контекста.просто для полноты картины, вот быстрая реализация
readlnЯ использую. Он имеет необязательный параметр для указания максимального количества байтов, которые вы хотите прочитать (который может быть или не быть длиной строки).Это также демонстрирует правильное использование комментарии swiftdoc-Swift создаст .файл swiftdoc и Xcode будут использовать его.
///reads a line from standard input /// ///:param: max specifies the number of bytes to read /// ///:returns: the string, or nil if an error was encountered trying to read Stdin public func readln(max:Int = 8192) -> String? { assert(max > 0, "max must be between 1 and Int.max") var buf:Array<CChar> = [] var c = getchar() while c != EOF && c != 10 && buf.count < max { buf.append(CChar(c)) c = getchar() } //always null terminate buf.append(CChar(0)) return buf.withUnsafeBufferPointer { String.fromCString(.baseAddress) } }
Другой альтернативой является ссылка libedit для правильного редактирования строки (клавиши со стрелками и т. д.) и опционная поддержка истории. Я хотел этого для проекта, который я начинаю и собрать основной пример того, как я его настроил.
использование от swift
let prompt: Prompt = Prompt(argv0: C_ARGV[0]) while (true) { if let line = prompt.gets() { print("You typed \(line)") } }ObjC обертка, чтобы выставить libedit
#import <histedit.h> char* prompt(EditLine *e) { return "> "; } @implementation Prompt EditLine* _el; History* _hist; HistEvent _ev; - (instancetype) initWithArgv0:(const char*)argv0 { if (self = [super init]) { // Setup the editor _el = el_init(argv0, stdin, stdout, stderr); el_set(_el, EL_PROMPT, &prompt); el_set(_el, EL_EDITOR, "emacs"); // With support for history _hist = history_init(); history(_hist, &_ev, H_SETSIZE, 800); el_set(_el, EL_HIST, history, _hist); } return self; } - (void) dealloc { if (_hist != NULL) { history_end(_hist); _hist = NULL; } if (_el != NULL) { el_end(_el); _el = NULL; } } - (NSString*) gets { // line includes the trailing newline int count; const char* line = el_gets(_el, &count); if (count > 0) { history(_hist, &_ev, H_ENTER, line); return [NSString stringWithCString:line encoding:NSUTF8StringEncoding]; } return nil; } @end
В общем readLine () функция используется для сканирования ввода с консоли. Но он не будет работать в обычном проекте iOS до тех пор, пока вы не добавите "инструмент командной строки".
лучший способ для тестирования, вы можете сделать :
1. Создайте файл macOS
2. Используйте функцию readLine () для сканирования необязательной строки из консоли
import Foundation print("Please enter some input\n") if let response = readLine() { print("output :",response) } else { print("Nothing") }выход :
Please enter some input Hello, World output : Hello, World Program ended with exit code: 0
вот простой пример принятия ввода от пользователя в консольном приложении: Вы можете использовать readline(). Возьмите вход с консоли для первого номера, затем нажмите enter. После этого возьмите вход для второго числа, как показано на рисунке ниже:
func solveMefirst(firstNo: Int , secondNo: Int) -> Int { return firstNo + secondNo } let num1 = readLine() let num2 = readLine() var IntNum1 = Int(num1!) var IntNum2 = Int(num2!) let sum = solveMefirst(IntNum1!, secondNo: IntNum2!) print(sum)
самый ранжированный ответ на этот вопрос предлагает использовать метод readLine () для ввода пользовательских данных из командной строки. Тем не менее, я хочу отметить, что вам нужно использовать ! оператор при вызове этого метода возвращает строку вместо необязательной:
var response = readLine()!
здесь.
пример
для разбора:
+42 st_ring! -0.987654321 12345678900 .42вы:
let stdin = StreamScanner.standardInput if let i: Int = stdin.read(), let s: String = stdin.read(), let d: Double = stdin.read(), let i64: Int64 = stdin.read(), let f: Float = stdin.read() { print("\(i) \(s) \(d) \(i64) \(f)") //prints "42 st_ring! -0.987654321 12345678900 0.42" }
клянусь Богом.. решение этой совершенно обычном!--6--> проблема ускользала от меня в течение многих лет. Это так простой.. но там так много неясной / плохой информации; надеюсь, я смогу спасти кто-то С некоторые бездонных кроличьи норы что я в конечном итоге...
Итак, давайте получим " строку "от" пользователя "через" консоль", через
stdin,мы должны?[NSString.alloc initWithData: [NSFileHandle.fileHandleWithStandardInput availableData] encoding:NSUTF8StringEncoding];если вы хочу его без на пустую строку, просто добавьте...
[ ... stringByTrimmingCharactersInSet: NSCharacterSet.newlineCharacterSet];
Ta Da!♥ Ꮺℯⅹ
это работает в xCode v6.2, я думаю, что это Swift v1. 2
func input() -> String { var keyboard = NSFileHandle.fileHandleWithStandardInput() var inputData = keyboard.availableData return NSString(data: inputData, encoding:NSUTF8StringEncoding)! as String }
Если вы хотите прочитать строку, разделенную пробелом, и сразу же разделить строку на массив, вы можете сделать это:
var arr = readLine()!.characters.split(" ").map(String.init)например.
print("What is your full name?") var arr = readLine()!.characters.split(" ").map(String.init) var firstName = "" var middleName = "" var lastName = "" if arr.count > 0 { firstName = arr[0] } if arr.count > 2 { middleName = arr[1] lastName = arr[2] } else if arr.count > 1 { lastName = arr[1] } print("First Name: \(firstName)") print("Middle Name: \(middleName)") print("Last Name: \(lastName)")
когда функция readLine () выполняется в Xcode, консоль отладки ожидает ввода. Остальная часть кода будет возобновлена после ввода.
let inputStr = readLine() if let inputStr = inputStr { print(inputStr) }
Я просто хотел прокомментировать (у меня не хватает повторений) реализацию xenadu, потому что
CCharв OS X-этоInt8, а Swift совсем не нравится, когда вы добавляете в массив whengetchar()возвращает части UTF-8, или что-нибудь еще выше 7 бит.Я использую массив
UInt8вместо этого, и он отлично работает иString.fromCStringпреобразованиеUInt8в UTF-8 просто отлично.однако вот как я это сделал
func readln() -> (str: String?, hadError: Bool) { var cstr: [UInt8] = [] var c: Int32 = 0 while c != EOF { c = getchar() if (c == 10 || c == 13) || c > 255 { break } cstr.append(UInt8(c)) } cstr.append(0) return String.fromCStringRepairingIllFormedUTF8(UnsafePointer<CChar>(cstr)) } while true { if let mystring = readln().str { println(" > \(mystring)") } }
Теперь я смог получить ввод с клавиатуры в Swift, используя следующее:
в моем основном.swift file я объявил переменную i и назначил ей функцию GetInt (), которую я определил в Objective C. Через так называемый заголовок моста, где я объявил прототип функции для GetInt, я мог бы связать с main.быстрый. Вот файлы:
главная.Свифт:
Преодоление:var i: CInt = GetInt() println("Your input is \(i) ");#include "obj.m" int GetInt();obj.м:
#import <Foundation/Foundation.h> #import <stdio.h> #import <stdlib.h> int GetInt() { int i; scanf("%i", &i); return i; }In параметр obj.m можно включить стандартный выход и вход c, stdio.h, а также стандартная библиотека c stdlib.h который позволяет вам программировать в C в Objective-C, что означает, что нет необходимости включать реальный swift файл, такой как user.c или что-то в этом роде.
надеюсь, я смогу помочь,
Edit: невозможно получить строковый ввод через C, потому что здесь я использую Cint -> целочисленный тип C, а не Swift. Для символа C не существует эквивалентного типа Swift*. Поэтому строка не преобразуется в строку. Но здесь достаточно решений, чтобы получить строковый ввод.
Рауль





Comments