Swift Introduction
From Hawk Wiki
Contents
- 1 Swift Basic
- 1.1 Var
- 1.2 Constant
- 1.3 Examples
- 1.4 Array & Dictionary
- 1.5 Optionals
- 1.6 Tuples
- 1.7 Closures
- 1.8 Class
- 1.9 Overriding properties
- 1.10 Struct
- 1.11 Struct and Class
- 1.12 Constant and Variables
- 1.13 Mutating a Structure
- 1.14 Enums
- 1.15 Enumerations: Associated Values
- 1.16 Extensions
- 1.17 Generic Stack Structure (Templates)
Swift Basic
Back To IOS_Swift
Var
var languageName = "Swift" // is simplified version of var languageName: String = "Swift"
Constant
let version = 1.0 // let version: Double = 1.0 //:Int, :Bool. :String let components = "~/Documents/Swift".pathComponents //["~", "Documents", "Swift"]
Examples
let a = 3, b = 5 let res = "\(a) times \(b) is \(a * b)" let dog = "dog" var dog1 = dog + "1" let a: Character = "a" let b: Character = "b" let ab = a + b
Array & Dictionary
//Emoty array var activeInputs: [CIImage] = [] //Must explicitly specify type var names = ["Anna", "Alex", 42] var names: String[] = ["Anna", "Alex"] var numOfLegs = ["ant": 6, "snake": 0] // Dictionary for x in names {} for number in 1...5 {} for num in 0..<5 {} //half close range for (name, legs) in numOfLegs {} //Tuple //Modify Array names += "Sam" names += ["Hao", "Dan"] names[0] = "x" names[3...5] = ["x", "y", "z"] numOfLegs["spider"] = 273 numOfLegs["spider"] = 8
Optionals
let possibleLegs: Int? = num OfLegs["aardvark"] //either get integer or nothing if possibleLegs == nil { } else { let legCount = possibleLegs! //forcing optional value to it's type } //A Simpler way if let legCount = possibleLegs { } Switch legCount { case 0: //no break case 1: case ExecButton: //match object case 1...5: case 2,4,6,8: default: //required } func sayHello(name:String = "default") { //give a default value println("Hello \(name)") }
Tuples
(404, "Not found") (2, "Banana", 0.42) let (statusCode, message) = refresh()
Closures
Closure has implicit return!
If you get an error from xcode related to wrong return type, try return something explicitly.
func repeat(count: Int, task: (idx: Int) -> ()) { for i in 0..<count { task(idx: i) } } repeat(2, { idx in println("hello: " + String(idx)) })
Class
class Vehicle { var numOfWheels = 0 //stored properties var description: String { //computed properties, has to be var get { //get is optional return "\(numOfWheels) wheels" } } } let someVehicle = Vehicle() //Auto alloc //inheritance class Bicycle: Vehicle { init() { //initializer super:init() numOfWheels = 2 } //properties observers override var speed: Double { willSet { if newValue > 65.0 { println('warning too fast') } } didSet { //oldValue available } } //method func accel() { speed += 0.1 } }
Overriding properties
class Car: Vehicle { var speed = 0.0 init() { super.init() numOfWheels = 4 } override var description: String { return super.description + ", Speed=\(speed) mph" } }
Struct
struct Point { var x: Double, y: Double } struct Rect { var origin: Point var size: Size //computed property var area: Double { return size.width * size.height } //method func isBiggerThanRect(other: Rect) => Bool { return self.area > other.area } } //init var point = Point(x: 0.0, y: 0.0) var rect = Rect(origin: point, size: size)
Struct and Class
1. struct cannot inherite
2. class is passed by reference. struct is passed by value
Constant and Variables
let window = Window(1.0, 1.0) //The reference is a constant, cannot change the reference value can do window.x = 1.0 cannot do window = Window(2.0, 2.0) var point1 = Point(x: 0.0, y: 0.0) // Point is struct. Since point1 is variable, we can do point1.x = 1.0 let point2 = Point(x: 0.0, y: 0.0) // Cannot do point2.x = 1.0 since point2 is constant
Mutating a Structure
struct Point { var x,y: Double //tell the complier this is a mutating function mutating func moveToRightBy(dx: Double) { x += dx } } let point1 = Point(x: 0.0, y: 0.0) point.moveToRightBy(20.0) //Error: Cannot mutate constant
Enums
enum Plannet: Int { case Mecury = 1, Venus case Earth = 5 } let earth = Planet.Earth.toRaw(); enum Direction { case west, east, north, south } var direction = Direction.west direction = .east //example label.testAlignment = .Right
Enumerations: Associated Values
enum FlightStatus { case OnTime case Delayed(Int) // minutes init() { self = OnTime } var desc: String { switch self { case OnTime: return "on time" case Delayed(let minutes): return "deplayed by \(minutes) minute(s)" } } } var status = FlightStatus // equals to var status = FlightStatus.OnTime status = .Delayed(30) status.desc //deplayed by 30 minute(s) //Nested Type class Flight { enum Status { case OnTime, Deplayed(Int) ... } var status = Status.OnTime }
Extensions
extension Size { mutating func scaleByFactor(factor: Int) { width *= factor height *= factor } } extension Int { func repetitions(task: () -> ()) { for i in 0..<self { task() } } } 400.repetitions { println("Hello!") }
Generic Stack Structure (Templates)
struct Stack<T> { var elements = <T>[]() func push {...} func pop {...} } var intStack = Stack<int>() intStack.push(60) let lastIn = intStack.pop()