Shai Mishali asks, “Is there something like readLine
that lets me read stdin as the user types instead of waiting for an entire line?” The readLine
function waits until the user presses enter or otherwise recognizes EOF to process input.
A little web search led me to this SO post, which is based on this example, using termios, the Unix API for terminal I/O. After looking through both posts, I built a RawMode
type to support direct input based on that code because nothing makes me happier than messing with solutions to make them a little swiftier.
To use this, you fetch bytes until you catch an EOF. It’s interesting to test both direct keyboard entries as well as pasting complex emojis. As I was working on this on both 10.14 and 10.15, I was mildly startled when my initial test code stopped working when I moved to 10.14. UnicodeScalar
does not offer a utf8
view until 10.15:
extension Unicode.Scalar { @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) @frozen public struct UTF8View { @inlinable internal init(value: Unicode.Scalar) { self.value = value } @usableFromInline internal var value: Unicode.Scalar } @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) @inlinable public var utf8: UTF8View { return UTF8View(value: self) } }
So thank you, Swift team, for giving us that. It’s a nice addition to the language!
Anyway, if you have a different approach or you can see ways to improve my take further, drop a comment and let me know.