Инструмент командной строки Xcode Swift считывает 1 символ с клавиатуры без эха или необходимости нажимать клавишу возврата

Мне нужна функция, такая как старая "getch()", в Objective C или Swift, чтобы читать один символ с клавиатуры без эха и без необходимости нажимать клавишу возврата после того, как символ был введен, чтобы функция продолжалась.

Я знаю, что это интересно только при программировании инструментов командной строки, возможно, для выбора или написания редактора.


person j.s.com    schedule 28.08.2014    source источник


Ответы (2)


Вот функция для использования со Swift, написанная на Swift:

func GetKeyPress () -> Int
{
    var key: Int = 0
    var c: cc_t = 0
    var cct = (c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c) // Set of 20 Special Characters
    var oldt: termios = termios(c_iflag: 0, c_oflag: 0, c_cflag: 0, c_lflag: 0, c_cc: cct, c_ispeed: 0, c_ospeed: 0)

    tcgetattr(STDIN_FILENO, &oldt) // 1473
    var newt = oldt
    newt.c_lflag = 1217  // Reset ICANON and Echo off
    tcsetattr( STDIN_FILENO, TCSANOW, &newt)
    key = Int(getchar())  // works like "getch()"
    tcsetattr( STDIN_FILENO, TCSANOW, &oldt)
    return key
}
person j.s.com    schedule 28.08.2014

Вот функция для использования с Objective-C и Swift, написанная на C:

#include <stdio.h>
#include <unistd.h>
#include <termios.h>
#include <string.h>

int Get_Key (void) {
    int key;
    struct termios oldt, newt;
    tcgetattr( STDIN_FILENO, &oldt); // 1473
    memcpy((void *)&newt, (void *)&oldt, sizeof(struct termios));
    newt.c_lflag &= ~(ICANON);  // Reset ICANON
    newt.c_lflag &= ~(ECHO);    // Echo off, after these two .c_lflag = 1217
    tcsetattr( STDIN_FILENO, TCSANOW, &newt); // 1217
    key=getchar(); // works like "getch()"
    tcsetattr( STDIN_FILENO, TCSANOW, &oldt);
    return key;
}
person j.s.com    schedule 28.08.2014