Update: Apple released the Swift source. My update based on what I learned is here.
A bit over a year ago, I wrote a post about how I wanted to do command line input in Apple’s then new Swift language.
The post was pretty well received and still get a hit / week.
On the heals of finishing the WWDC 2015 session videos, I decided to start tinkering a bit more with the language. Toward this end, I’ve been re-implementing old command line games from the 1970s that were written in BASIC. This forced me to actually go back to my command line input code. Dutifully allowing XCode to update it to Swift 2 syntax, I noticed that it relied way too much on Objective C bits. I also didn’t like the way it was handling the translation from string to numeric. So, I’ve updated it.
Yes, I should just put it up on GitHub. Maybe later. For now, just cut and paste it.
// // swift_intput_routines.swift // // Created by Charles Wilson on 9/27/2014. // Revised by Charles Wilson on 9/26/2015. // // Copyright (c) 2014 - 2015 Charles Wilson. All rights reserved. // // Permission is granted to use and modify so long as attribution is made. // import Foundation func putString (outputString : String = "") { if !outputString.isEmpty { NSFileHandle.fileHandleWithStandardOutput().writeData((outputString as NSString).dataUsingEncoding(NSUTF8StringEncoding)!) } } func getString (prompt : String = "") -> String { if !prompt.isEmpty { putString(prompt) } var inputString : NSString = "" let data : NSData? = NSFileHandle.fileHandleWithStandardInput().availableData if ( data != nil ) { inputString = NSString(data: data!, encoding: NSUTF8StringEncoding)! inputString = inputString.substringToIndex(inputString.length - 1) } return String(inputString) } func getCharacter () -> Character { let inputValue : UInt32 = UInt32(getchar()) var inputCharacter : Character inputCharacter = Character(UnicodeScalar(inputValue)) return inputCharacter } func getInteger (prompt : String = "") -> Int { if !prompt.isEmpty { putString(prompt) } return (getString() as NSString).integerValue } func getFloat (prompt : String = "") -> Float { if !prompt.isEmpty { putString(prompt) } return (getString() as NSString).floatValue }
I also update the test routine as I wasn’t checking the float bits.
// // main.swift // // Created by Charles Wilson on 9/27/2014. // Revised by Charles Wilson on 9/26/2015. // // Copyright (c) 2014 - 2015 Charles Wilson. All rights reserved. // // Permission is granted to use and modify so long as attribution is made. // import Foundation var name = getString("What is your name? ") if name.isEmpty { name = "George" putString("That's not much of a name. I'll call you '\(name)'\n") } else { putString("Your name is '\(name)'\n") } let age = getInteger("How old are you \(name)? ") putString("You are \(age) years old\n") let number = getInteger() putString("\(number) is a nice number\n") let floating = getFloat("Enter a floating point number: ") putString("\(floating) works for me\n") var c : Character putString("Type stuff. Enter ^ when done.\n") let sentinel : Character = Character(UnicodeScalar("^")) var in_c : Character repeat { in_c = getCharacter() } while ( in_c != sentinel ) putString("\n\n") putString("bye\n")
[…] It’s been a year and much has happened with Swift. Please see my latest post on Swift command line input for current […]
[…] on the Swift command line. In the first, I wrote on how to do command line input with Swift. In the second, I cleaned up the code after a year of tinkering with Swift. In this third installment, I get rid […]