У меня есть пользовательский подкласс NSView, который должен обрабатывать некоторые события клавиатуры. В Objective-C я могу справиться с этим следующим образом:
-(void)keyDown:(NSEvent *)event
{
unichar ch = [[event charactersIgnoringModifiers] characterAtIndex:0];
if (ch == NSUpArrowFunctionKey && (event.modifierFlags & NSCommandKeyMask)) {
// Scroll to top
return;
}
else if (ch == NSDownArrowFunctionKey && (event.modifierFlags & NSCommandKeyMask)) {
// Scroll to bottom
return;
}
switch (ch) {
case NSRightArrowFunctionKey:
// Select the current row
return;
case ' ':
// Scroll down one page
return;
default:
break;
}
[super keyDown:event];
}
В Swift, однако, characterAtIndex:
возвращает a unichar
, а NSUpArrowFunctionKey: Int
и " ": String
(или Character
). Мне не ясно, как преобразовать unichar в String
или Character
.
Я получил эту работу, но это похоже на уродливое обходное решение. Есть ли лучший способ?
func keyDown(theEvent: NSEvent) {
let char = Int(theEvent.charactersIgnoringModifiers.utf16[0]) // <----- This seems ugly
let hasCommand = (theEvent.modifierFlags & .CommandKeyMask).value != 0
switch char {
case NSUpArrowFunctionKey where hasCommand == true:
// Scroll to top
break
case NSDownArrowFunctionKey where hasCommand == true:
// Scroll to bottom
break
case NSRightArrowFunctionKey where hasCommand == true:
// Select the current row
break
case Int(" ".utf16[0]): // <---- Surely there a better way of doing this?
// Scroll down one page
break
default:
super.keyDown(theEvent)
}
}