Swift
Introduction
Here is my first dip into Apple and swift
Swift Cheat Sheet
And the documentation
Docs
Data Types
Here we have the following Primatives
- Int
- Float
- Double
- String
- Bool
Control
If Statements
No surprises
if a < 4 {
print("we are here 1")
}
else if a == 4 && a < 3 {
print("we are here 2")
}
else {
print("we are here 3")
}
Switch Statements
var aCharacter = "a"
switch aCharacter {
case "a":
print("we are here a")
case "b":
print("we are here b")
default:
print("we are here not a or b")
}
Loops
Example for loop
var sum = 0
for index in 1..5 {
sum += index
print(sum)
}
Example for while loop
var counter = 5
while counter > 0 {
print("hello")
counter -= 1
}
Example for repeat while loop
var counter = 5
repeat {
print("hello")
counter -= 1
} while counter > 0
Functions
Simple example
func foo() {
print("Fred")
}
foo()
The argument label, the first argument, is just a name to use in place or variable name
func addTwoNumbers(
arg1 para1:Int,
arg2 para2:Int) -> Int {
return para1 + para2
}
let sum = addTwoNumbers(arg: 2)
print(sum)
Collections
Arrays
Using Arrays
var d = ["dog", "cat", "bird"]
// Using standard for loop
for index in 0...(d.count -1) {
print(d[index])
}
// Alternatively
for item in d {
print(item)
}
// Declare empty
var e = [String]()
// Add or Remove
e.append(d)
e.remove(1)
e[0] = "turtle"
Dictionaries
Using a dictionary
// Initialize may values
var responseMessages = [200: "OK",
403: "Access forbidden",
404: "File not found",
500: "Internal server error"]
// Initialize empty
var emptyDict: [String: String] = [:]
// Another approach
var carDB = Dictionary[String:String]()
carDB["DTQ 9999"] = "iCar"
carDB["RPA 248"] = "Jag"
// Update
carDB["RPA 248"] = "Red Jag"
// Remove
carDB["RPA 248"] = nil
// Iterate
for (license, car ) in carDB {
print("\(car) has license \(license)")
}
Classes
Base Claas
class BlogPost {
var title = ""
var body = ""
var counter = 0
func addCounter() {
counter += 1
}
}
let myPost = BlogPost()
myPost.title = "Hello"
myPost.body = "My Body"
myPost.addCounter()
print(myPost.counter)
Optional Properties
We can make properties optional. Like most languages we need to test
class BlogPost {
var title:String?
var body = "hey"
var counter = 0
}
let post = BlogPost()
// We test like this.
if let actualTitle = post.title {
print(actualTitle)
}
// If you know you have a value you can override
post.title = "we have a value"
actualTitle = post.title
print(actualTitle!)
// Or
if actualTitle == nil {
print(actualTitle!)
}
Computed Properties
class BlogPost {
var title:String?
var author:String = "hey"
// Computed Property
if title != nil && author != nil {
return title! + " by " + author
}
else {
return "Something was nil"
}
}
Initialise (Constructor)
We use self in place of this for other languages. Don't forget about argument labels. Note more than one init() permitted
class Person {
var name = ""
var age = 0
func init(_ name: String) {
self.name = name
self.age = 22
}
func init(_ name: String, _ age: Init) {
self.name = name
self.age = age
}
}
var a Person("Bill", 21)
Convenience Initializewr
This allows you to create an initializer where maybe only one parameter is different. It must call a standard (designated) initializer
struct Scene {
var minutes = 0
}
class Movie {
var title: String
var author: String
var date: Int
var scenes: [Scene]
init(title: String, author: String, date: Int) {
self.title = title
self.author = author
self.date = date
scenes = [Scene]()
}
convenience init(title:String) {
self.init(title:title, author: "Unknown", date:2016)
}
func addPage(page: Scene) {
scenes.append(page)
}
}
var myMovie = Movie(title: "my title") // Using convenicence initializer
var otherMovie = Movie(title: "My Title", author: "My Author", date: 12) // Using a long normal initializer
Inheritance
We do this using a colon
class ImprovedBlog : BlogPost {
var title = ""
var body = ""
var numberOfLikes = 0
func addNumberOfLikes() {
numberOfLikes += 1
}
}
Override can be used and you can call the base implementation
class NewCar : Car {
override func drive() {
print("Printing my stuff")
// Print base stuff
super.drive()
}
}