The Basics
Swift opts to use a Javascript-like ‘var’ keyword to define any new variable.
So for example to create a new variable with a bit of text in it, you would have this:
var myString = "This is my string." |
This is declared with a var
so the variable can change at any time, similar to most languages.
However the let
keyword creates constants. These can not ever be changed once they are defined. If you try, a compiler error will appear and the program just won’t run.
let someConstant = 40 |
In this case kSomeConstant is implicitly defined as an integer, or Int
. If you want to be more specific you can specify which type it is like so:
let someOtherConstant: Int = 40 |
With both arrays and dictionaries, they are described using brackets []
var colorsArray = [ "Blue" , "Red" , "Green" , "Yellow" ] var colorsDictionary = [ "PrimaryColor" : "Green" , "SecondaryColor" : "Red" ] |
You can access the members of an array with integer value indexes, and the members of a dictionary with String keys (or other types, but that’ll come in later tutorials)
let firstColor = colorsArray[0] // firstColor is now "Blue" let aColor = colorsDictionary[ "PrimaryColor" ] // aColor is now "Green" |
There’s a lot more to go over, but I think these basics are important to get a start going on to the tutorial. So with that, let’s move on to Hello World. If you want to play around with this a bit yourself before getting going on our first iPhone App. Be sure to check out the Playground containing this sample code on Github.
Hello World
First, we’re going to write the simplest app imaginable to get started, Hello World. This segment comes directly from my upcoming book on Swift development, but it’s so important and fundamental to getting started I thought it would be good to release for free here.
Our app will only do one thing: print “Hello World” to the console. You’ll need a developer copy of Xcode in order to follow along, which requires a developer account. If you have one, head on over to http://developer.apple.com and get your copy before we begin.
So now you’ve got your IDE set up. Let’s write hello world out to the console. This example demonstrates the simplest app that can be built, and more importantly shows that you’re environment is set up correctly.
Set up an Xcode project using the single-view application template, and make sure you opt for Swift as the language.
You should now find an AppDelegate.swift file in the project hierarchy. Inside of this file find the line that says:
"// Override point for customization after application launch." |
Replace this line with our amazing hello world code:
print ( "Hello World" ) |
Now press run and you should see a blank app boot up, and the words “Hello World” print to the console.
Note that this will not show up in the iPhone simulator. Look at the bottom of your Xcode window and you’ll see a console that says ‘Hello World!’.
Congratulations! You just wrote your first app in Swift! This app probably won’t win any awards, let’s trying doing something a little deeper…
Adding a Table View
In this section, we’re going to actually put some stuff on the screen.
Open up your Main.storyboard file in Xcode and lets drag in a “Table View” object from the Object Library (don’t use a table view controller.) Position this fullscreen in your app window and make sure it lines up with the edges. Then resize the height by dragging down the top edge and giving a little bit of space (this gives room for the status bar at the top of the phone.) If you run the app at this point, you should see an empty table view in the simulator.
The empty table view in the iPhone Simulator:
Now we need to set up a delegate and data source for the table view. The Data Source is an object that informs the Table View of which data to show. The delegate let’s us handle interactions such as tapping a row on the Table View.
Setting these outlets is easy to do in interface builder. Just hold control, and then click and drag from the tableview to the “View Controller” object in your storyboard’s hierarchy, and select ‘data source’. Repeat with the ‘delegate’ options.
Setting Up The Uitableview Data Source And Delegates
I’ve received a ton of questions about this, and many people reporting errors about the table view not being set, so to make things a little easier I made a quick video showing how connecting Storyboard objects to your code works. Make sure to go fullscreen and select the 720p option to make sure you can see what’s happening. This will look slightly different from the Xcode interface you are using, but functionally all this works the same.
Okay, now let’s dig in to the protocol methods for Table Views. Because we’re using the UITableViewDataSource
and UITableViewDelegate
in our view controller, we need to modify the class definition to say as much.
So open ViewController.swift and modify this line:
class ViewController : UIViewController { |
to this:
class ViewController : UIViewController , UITableViewDataSource , UITableViewDelegate { |
This will cause some errors to pop up, but don’t worry this is expected. In fact, the errors are the primary purpose of indicating these protocols on our class. It lets us know that we aren’t done actually implementing the UITableViewDataSource or the UITableViewDelegate yet.
Command+clicking on either of these protocols will show the required functions at the very top. In the case of a tableview dataSource, we need at least these two:
public func tableView(_ tableView: UITableView , numberOfRowsInSection section: Int ) -> Int public func tableView(_ tableView: UITableView , cellForRowAt indexPath: IndexPath ) -> UITableViewCell |
So let’s modify our View Controller class by adding these two functions.
func tableView(_ tableView: UITableView , numberOfRowsInSection section: Int ) -> Int { return 10 } func tableView(_ tableView: UITableView , cellForRowAt indexPath: IndexPath ) -> UITableViewCell { let cell = UITableViewCell (style: .subtitle, reuseIdentifier: "MyTestCell" ) cell.textLabel?.text = "Row \(indexPath.row)" cell.detailTextLabel?.text = "Subtitle \(indexPath.row)" return cell } |
As a handy trick, when you need to write these long methods for cases like this, you can just start typing the function in Xcode, focusing on the unique part of the name such as “cellForRo…” and Xcode will usually auto-complete what you were typing.
The first method is asking for the number of rows in our section, in this simple tutorial we just hard-code 10, but normally it would be the length of an array controller. This example is intentionally simple.
The second method is where the magic happens. Here we create a new instance of a UITableViewCell called cell, using the Subtitle cell style.
Then, we assign the text value of this cell to the string “Row #(indexPath.row)”
In Swift, this is how variables are embedded within a string. What we’re doing is retrieving the value of indexPath.row by inserting (indexPath.row) in to our string, and dynamically replacing it with the row number of the cell. This allows results such as “Row #1″, “Row #2″, etc.
The detail text label is only available in the Subtitle cell class, which we are using here. We set it similarly to “Subtitle #1″, “Subtitle #2″, and so on.