I’m a bit of a fan of Swift, though I don’t get to tinker with it nearly as much as I’d like. Recently, though, I did some tinkering with Swift as a scripting language, and thought it was pretty fun! (I’m planning another blog post about what, exactly, I was trying to do later, but for now just take it as a given.)
The most important step is to have Swift installed on your machine. As a Mac user, the easiest way is probably just to install Xcode, but if you’re looking for a lighter-weight solution, you can install just the Swift toolchain. Swift is also available for Ubuntu, which, again, takes some doing. If you want Swift on Windows… well, it’s an ongoing project. Personally, I’d say you’ll probably have better luck running it in Ubuntu on the WSL.
Alright, got your Swift installation working? Let’s go.
Step 1: Make your Swift file. We’ll call it
main.swift, and in true Tech Tutorial fashion, we’ll keep it simple:
Step 2: Insert a Magic Comment in the first line:
#!/usr/env/swift print("Hello world!")
Step 3: In your shell of choice, make it executable:
$ chmod +x ./main.swift
Step 4: Run!
$ ./main.swift > Hello world!
No, really, it’s that simple. The magic comment there tells your interpreter ‘run this using Swift’, and then Swift just… executes your code from top to bottom. And it doesn’t have to be just function calls — you can define classes, structs, enums, whatever. Which is the real benefit to using Swift instead of just writing your script in Bash; object-oriented programming and type safety are lovely, lovely things.
My next post is going to go into some of the more interesting stuff you can do, with a lovely worked example, but for now I’ll add a couple other things:
- By default, execution ends when it gets to the end of the file; at that point, it will exit with code 0, so Bash (or whatever) will assume it worked correctly. If you want to exit earlier, call
exit(_:)with the code you want.
exit(0)means “done successfully,” while any other integer in there will be treated as an error.1
stdout, which can be piped using
|. If you want to output an error (to be piped with
2>, or similar) you need to
import Foundation, and then call
- To explicitly write to
Which is useful if your script is going to be called programmatically.
./main.swift && echo "It worked!"will print “Hello world” and then “It worked!” with
exit(0), but just “Hello world” if you add
exit(1)to the end of the file. ↩
And note the types here – this expects
String, so to write a string, you need to convert it by adding