(Swift) 키보드로부터 문자열을 입력받기

키보드로부터 문자열을 입력받는 함수

Swift의 표준 함수 중에서 input() 과 같은 함수가 없었는데, readLine() 함수가 생겼다. 원형은 다음과 같다.

@warn_unused_result func readLine(stripNewline stripNewline: Bool = true) ->; String?

이 함수는 키보드로부터 입력받은 문자열을 (UTF-8로 가정한다) 리턴해준다. 물론 디코딩상의 문제가 있을 수 있어서 출력되는 값은 옵셔널이다. 요상하게도 C의 대부분의 함수는 그대로 사용할 수 있는 것 같은데 입출력에 관련된 함수 (scanf, printf 등)은 쓸 수가 없다.

이 함수가 나오기 이전에는 다음과 같은 식으로 구현해서 쓸 수는 있었다.

func input() ->; String {
    let kbd = NSFileHandle.fileHandleWithStandardInput()
    let data = kdb.availableData
    return NSString(data:data, encoding:UTF8StringEncoding) as! String
}

문제는 이런 코드는 앞에 프롬프트 출력이 되지 않는 문제가 있다.

print("yourname: ", terminator:"")
let s = input()
print("hello, \(s)")

// (출력되지 않음) sooop
// yourname: hello, sooop

하지만 readLine 함수는 이런 문제가 말끔히 해결된다.

func input(prompt: String?=nil) -> String? {
    if let p = prompt where !p.isEmpty {
        print(p, terminator:"")
    }
    return readLine()
}

if let s = input("yourname: ") {
    print("hello, \(s)")
}

게다가 Foundation에 의존하지 않기 때문에 스크립트로도 충분히 작동한다.