[swift] 명령 줄 응용 프로그램에서 키보드로 입력

새로운 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)

산출