새로운 Apple 프로그래밍 언어 Swift에 대한 명령 줄 앱의 키보드 입력을 얻으려고합니다.
문서를 스캔하여 아무 소용이 없습니다.
import Foundation
println("What is your name?")
???
어떤 아이디어?
답변
이를 수행하는 올바른 방법 readLine
은 Swift Standard Library에서 를 사용하는 것 입니다.
예:
let response = readLine()
입력 한 텍스트가 포함 된 선택적 값을 제공합니다.
답변
나는 C로 떨어지지 않고 그것을 알아낼 수 있었다.
내 솔루션은 다음과 같습니다.
func input() -> String {
var keyboard = NSFileHandle.fileHandleWithStandardInput()
var inputData = keyboard.availableData
return NSString(data: inputData, encoding:NSUTF8StringEncoding)!
}
최신 버전의 Xcode에는 명시적인 typecast가 필요합니다 (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
. 나는 약간의 예를 만들었습니다.
main.swift
import Foundation
var output: CInt = 0
getInput(&output)
println(output)
UserInput.c
#include <stdio.h>
void getInput(int *output) {
scanf("%i", output);
}
cliinput-Bridging-Header.h
void getInput(int *output);
답변
편집 Swift 2.2부터 표준 라이브러리에는 readLine
. 또한 Swift가 문서 주석을 마크 다운으로 전환 한 것에 주목할 것입니다. 역사적 맥락에 대한 나의 원래 대답을 남겨 둡니다.
완전성을 위해 여기에 readln
내가 사용해온 Swift 구현이 있습니다. 읽을 최대 바이트 수를 나타내는 선택적 매개 변수가 있습니다 (문자열의 길이 일 수도 있고 아닐 수도 있음).
이것은 또한 swiftdoc 주석의 적절한 사용을 보여줍니다. Swift는 <project> .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($0.baseAddress) }
}
답변
일반적으로 readLine () 함수는 콘솔에서 입력을 스캔하는 데 사용됩니다. 그러나 “명령 줄 도구” 를 추가하거나 추가하지 않는 한 일반 iOS 프로젝트에서는 작동하지 않습니다 .
테스트를위한 가장 좋은 방법은 다음과 같습니다.
1. macOS 파일 생성
2. readLine () func를 사용하여 콘솔에서 선택적 문자열을 스캔합니다.
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
답변
또 다른 대안은 적절한 행 편집 (화살표 키 등) 및 선택적 히스토리 지원을 위해 libedit 를 링크 하는 것입니다. 나는 내가 시작하는 프로젝트를 위해 이것을 원했고 그것을 설정하는 방법에 대한 기본 예제를 모았 습니다 .
신속한 사용
let prompt: Prompt = Prompt(argv0: C_ARGV[0])
while (true) {
if let line = prompt.gets() {
print("You typed \(line)")
}
}
libedit를 노출하는 ObjC 래퍼
#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 ()을 사용할 수 있습니다. 콘솔에서 첫 번째 숫자를 입력 한 다음 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)