Xcode 10.2 • Swift 5
Вы можете расширить StringProtocol, чтобы сделать индекс доступным также для подстрок:
extension StringProtocol {
subscript(offset: Int) -> Element {
return self[index(startIndex, offsetBy: offset)]
}
subscript(_ range: Range<Int>) -> SubSequence {
return prefix(range.lowerBound + range.count)
.suffix(range.count)
}
subscript(range: ClosedRange<Int>) -> SubSequence {
return prefix(range.lowerBound + range.count)
.suffix(range.count)
}
subscript(range: PartialRangeThrough<Int>) -> SubSequence {
return prefix(range.upperBound.advanced(by: 1))
}
subscript(range: PartialRangeUpTo<Int>) -> SubSequence {
return prefix(range.upperBound)
}
subscript(range: PartialRangeFrom<Int>) -> SubSequence {
return suffix(Swift.max(0, count - range.lowerBound))
}
}
extension LosslessStringConvertible {
var string: String { return .init(self) }
}
extension BidirectionalCollection {
subscript(safe offset: Int) -> Element? {
guard !isEmpty, let i = index(startIndex, offsetBy: offset, limitedBy: index(before: endIndex)) else { return nil }
return self[i]
}
}
<час> Тестирование
let test = "Hello USA
Что вы хотите сделать, так это перевести консоль в "сырой" режим (строковое редактирование игнорируется и клавиша ввода не требуется) в отличие от "приготовленного" режима (требуется редактирование строки с помощью клавиши ввода). В системах UNIX команда 'stty' может изменять режимы.
Теперь, что касается Java ... см. Неблокирующий ввод консоли в Python и Java . Отрывок:
Если ваша программа должна быть консольной, вы должны выключить свой терминал строчного режима в символьный, и не забудьте восстановить его до вашего программа завершает работу. Нет портативного способ сделать это через операционные систем.
Одно из предложений - использовать JNI. Опять же, это не очень удобно. Еще одно предложение в конце обсуждения и общее с сообщением выше - посмотреть на использование jCurses .