Эквивалент getch () в Swift: чтение одного символа из стандартного ввода без перевода строки - PullRequest
0 голосов
/ 18 января 2020

Я ищу функцию Swift, такую ​​как getch() из C, чтобы читать один символ с терминального ввода, не требуя от пользователя нажатия клавиши возврата. getchar() и readLine() недостаточно, поскольку они оба требуют возврата.

Существует функция getch() от ncurses, которая Выглядело многообещающе, но, к сожалению, , кажется, требует , чтобы взять на себя отображение всего окна.

1 Ответ

0 голосов
/ 18 января 2020

Пройдя поиск в сети, я обнаружил следующее (частично основываясь на этом ответе ):

import Foundation

extension FileHandle {
    func enableRawMode() -> termios {
        var raw = termios()
        tcgetattr(self.fileDescriptor, &raw)

        let original = raw
        raw.c_lflag &= ~UInt(ECHO | ICANON)
        tcsetattr(self.fileDescriptor, TCSADRAIN, &raw)
        return original
    }

    func restoreRawMode(originalTerm: termios) {
        var term = originalTerm
        tcsetattr(self.fileDescriptor, TCSADRAIN, &term)
    }
}

func getch() -> UInt8 {
    let handle = FileHandle.standardInput
    let term = handle.enableRawMode()
    defer { handle.restoreRawMode(originalTerm: term) }

    var byte: UInt8 = 0
    read(handle.fileDescriptor, &byte, 1)
    return byte
}

fputs("Press any key to continue... ", stdout)
fflush(stdout)

let x = getch()
print()
print("Got character: \(UnicodeScalar(x))")
...