-
-
Save owensd/e4b8dd94daf2ec3a6d43 to your computer and use it in GitHub Desktop.
Contains a sample of the majority of syntax constructs in Swift.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* This is a sample file of most (all?) of the possible syntax constructs within Swift. | |
*/ | |
var mutable_bad = "This is an inferred String type." | |
let immutable_good: String = "This is an explicit \"immutable\" String type." | |
let x = 10, y: Int, z = 121; | |
y = 0x0A | |
let unicode = "Dog! 🐶" | |
println("\(unicode) : (x, y, z) = (\(x), \(y), \(z))") | |
let catCharacters: [Character] = ["C", "a", "t", "!", "🐱"] | |
let string1 = "hello" | |
let string2 = " there" | |
var welcome = string1 + string2 | |
var instruction = "look over" | |
instruction += string2 | |
let exclamationMark: Character = "!" | |
welcome.append(exclamationMark) | |
let multiplier = 3 | |
let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)" | |
let eAcute: Character = "\u{E9}" // é | |
let combinedEAcute: Character = "\u{65}\u{301}" // e followed by ́ | |
let romeoAndJuliet = [ | |
"Act 1 Scene 1: Verona, A public place", | |
"Act 1 Scene 2: Capulet's mansion", | |
"Act 1 Scene 3: A room in Capulet's mansion", | |
"Act 1 Scene 4: A street outside Capulet's mansion", | |
"Act 1 Scene 5: The Great Hall in Capulet's mansion", | |
"Act 2 Scene 1: Outside Capulet's mansion", | |
"Act 2 Scene 2: Capulet's orchard", | |
"Act 2 Scene 3: Outside Friar Lawrence's cell", | |
"Act 2 Scene 4: A street in Verona", | |
"Act 2 Scene 5: Capulet's mansion", | |
"Act 2 Scene 6: Friar Lawrence's cell" | |
] | |
var someInts = [Int]() | |
println("someInts is of type [Int] with \(someInts.count) items.") | |
var threeDoubles = [Double](count: 3, repeatedValue: 0.0) | |
var shoppingList: [String] = ["Eggs", "Milk"] | |
shoppingList += ["Chocolate Spread", "Cheese", "Butter", "Peanuts", "Bread"] | |
if shoppingList.isEmpty { | |
println("The shopping list is empty.") | |
} else { | |
println("The shopping list is not empty.") | |
} | |
shoppingList[4...6] = ["Bananas", "Apples"] | |
for (index, value) in enumerate(shoppingList) { | |
println("Item \(index + 1): \(value)") | |
} | |
var namesOfIntegers = [Int: String]() | |
namesOfIntegers[16] = "sixteen" | |
namesOfIntegers = [:] | |
var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"] | |
for (airportCode, airportName) in airports { | |
println("\(airportCode): \(airportName)") | |
} | |
let airportNames = [String](airports.values) | |
for index in 1...5 { | |
println("\(index) times 5 is \(index * 5)") | |
} | |
let base = 3 | |
let power = 10 | |
var answer = 1 | |
for _ in 1...power { | |
answer *= base | |
} | |
println("\(base) to the power of \(power) is \(answer)") | |
let names = ["Anna", "Alex", "Brian", "Jack"] | |
for name in names { | |
println("Hello, \(name)!") | |
} | |
for var index = 0; index < 3; ++index { | |
println("index is \(index)") | |
} | |
while true { | |
println("Hello!") | |
break | |
} | |
do { | |
println("Hello!") | |
break | |
} while true | |
let temperatureInFahrenheit = 90 | |
if temperatureInFahrenheit <= 32 { | |
println("It's very cold. Consider wearing a scarf.") | |
} else if temperatureInFahrenheit >= 86 { | |
println("It's really warm. Don't forget to wear sunscreen.") | |
} else { | |
println("It's not that cold. Wear a t-shirt.") | |
} | |
let someCharacter: Character = "e" | |
switch someCharacter { | |
case "a", "e", "i", "o", "u": | |
println("\(someCharacter) is a vowel") | |
case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m", | |
"n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z": | |
println("\(someCharacter) is a consonant") | |
default: | |
println("\(someCharacter) is not a vowel or a consonant") | |
} | |
let count = 3_000_000_000_000 | |
let countedThings = "stars in the Milky Way" | |
var naturalCount: String | |
switch count { | |
case 0: | |
naturalCount = "no" | |
case 1...3: | |
naturalCount = "a few" | |
case 4...9: | |
naturalCount = "several" | |
case 10...99: | |
naturalCount = "tens of" | |
case 100...999: | |
naturalCount = "hundreds of" | |
case 1000...999_999: | |
naturalCount = "thousands of" | |
default: | |
naturalCount = "millions and millions of" | |
} | |
println("There are \(naturalCount) \(countedThings).") | |
let somePoint = (1, 1) | |
switch somePoint { | |
case (0, 0): | |
println("(0, 0) is at the origin") | |
case (_, 0): | |
println("(\(somePoint.0), 0) is on the x-axis") | |
case (0, _): | |
println("(0, \(somePoint.1)) is on the y-axis") | |
case (-2...2, -2...2): | |
println("(\(somePoint.0), \(somePoint.1)) is inside the box") | |
default: | |
println("(\(somePoint.0), \(somePoint.1)) is outside of the box") | |
} | |
let anotherPoint = (2, 0) | |
switch anotherPoint { | |
case (let x, 0): | |
println("on the x-axis with an x value of \(x)") | |
case (0, let y): | |
println("on the y-axis with a y value of \(y)") | |
case let (x, y): | |
println("somewhere else at (\(x), \(y))") | |
} | |
let yetAnotherPoint = (1, -1) | |
switch yetAnotherPoint { | |
case let (x, y) where x == y: | |
println("(\(x), \(y)) is on the line x == y") | |
case let (x, y) where x == -y: | |
println("(\(x), \(y)) is on the line x == -y") | |
case let (x, y): | |
println("(\(x), \(y)) is just some arbitrary point") | |
} | |
let puzzleInput = "great minds think alike" | |
var puzzleOutput = "" | |
for character in puzzleInput { | |
switch character { | |
case "a", "e", "i", "o", "u", " ": | |
continue | |
default: | |
puzzleOutput.append(character) | |
} | |
} | |
println(puzzleOutput) | |
let numberSymbol: Character = "三" // Simplified Chinese for the number 3 | |
var possibleIntegerValue: Int? | |
switch numberSymbol { | |
case "1", "١", "一", "๑": | |
possibleIntegerValue = 1 | |
case "2", "٢", "二", "๒": | |
possibleIntegerValue = 2 | |
case "3", "٣", "三", "๓": | |
possibleIntegerValue = 3 | |
case "4", "٤", "四", "๔": | |
possibleIntegerValue = 4 | |
default: | |
break | |
} | |
if let integerValue = possibleIntegerValue { | |
println("The integer value of \(numberSymbol) is \(integerValue).") | |
} else { | |
println("An integer value could not be found for \(numberSymbol).") | |
} | |
let integerToDescribe = 5 | |
var description = "The number \(integerToDescribe) is" | |
switch integerToDescribe { | |
case 2, 3, 5, 7, 11, 13, 17, 19: | |
description += " a prime number, and also" | |
fallthrough | |
default: | |
description += " an integer." | |
} | |
println(description) | |
let finalSquare = 25 | |
var board = [Int](count: finalSquare + 1, repeatedValue: 0) | |
board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02 | |
board[14] = -10; board[19] = -11; board[22] = -02; board[24] = -08 | |
var square = 0 | |
var diceRoll = 0 | |
gameLoop: while square != finalSquare { | |
if ++diceRoll == 7 { diceRoll = 1 } | |
switch square + diceRoll { | |
case finalSquare: | |
// diceRoll will move us to the final square, so the game is over | |
break gameLoop | |
case let newSquare where newSquare > finalSquare: | |
// diceRoll will move us beyond the final square, so roll again | |
continue gameLoop | |
default: | |
// this is a valid move, so find out its effect | |
square += diceRoll | |
square += board[square] | |
} | |
} | |
println("Game over!") | |
func sayHello(personName: String) -> String { | |
let greeting = "Hello, " + personName + "!" | |
return greeting | |
} | |
func halfOpenRangeLength(start: Int, end: Int) -> Int { | |
return end - start | |
} | |
println(halfOpenRangeLength(1, 10)) | |
func sayHelloWorld() -> String { | |
return "hello, world" | |
} | |
println(sayHelloWorld()) | |
func sayGoodbye(personName: String) { | |
println("Goodbye, \(personName)!") | |
} | |
sayGoodbye("Dave") | |
func minMax(array: [Int]) -> (min: Int, max: Int) { | |
var currentMin = array[0] | |
var currentMax = array[0] | |
for value in array[1..<array.count] { | |
if value < currentMin { | |
currentMin = value | |
} else if value > currentMax { | |
currentMax = value | |
} | |
} | |
return (currentMin, currentMax) | |
} | |
let bounds = minMax([8, -6, 2, 109, 3, 71]) | |
println("min is \(bounds.min) and max is \(bounds.max)") | |
func minMax(array: [Int]) -> (min: Int, max: Int)? { | |
if array.isEmpty { return nil } | |
var currentMin = array[0] | |
var currentMax = array[0] | |
for value in array[1..<array.count] { | |
if value < currentMin { | |
currentMin = value | |
} else if value > currentMax { | |
currentMax = value | |
} | |
} | |
return (currentMin, currentMax) | |
} | |
if let bounds = minMax([8, -6, 2, 109, 3, 71]) { | |
println("min is \(bounds.min) and max is \(bounds.max)") | |
} | |
func someFunction(parameterName: Int) { | |
// function body goes here, and can use parameterName | |
// to refer to the argument value for that parameter | |
} | |
func someFunction(externalParameterName localParameterName: Int) { | |
// function body goes here, and can use localParameterName | |
// to refer to the argument value for that parameter | |
} | |
func join(string s1: String, toString s2: String, withJoiner joiner: String) -> String { | |
return s1 + joiner + s2 | |
} | |
println(join(string: "hello", toString: "world", withJoiner: ", ")) | |
func containsCharacter(#string: String, #characterToFind: Character) -> Bool { | |
for character in string { | |
if character == characterToFind { | |
return true | |
} | |
} | |
return false | |
} | |
let containsAVee = containsCharacter(string: "aardvark", characterToFind: "v") | |
func join2(string s1: String, toString s2: String, | |
withJoiner joiner: String = " ") -> String { | |
return s1 + joiner + s2 | |
} | |
func join3(s1: String, s2: String, joiner: String = " ") -> String { | |
return s1 + joiner + s2 | |
} | |
func arithmeticMean(numbers: Double...) -> Double { | |
var total: Double = 0 | |
for number in numbers { | |
total += number | |
} | |
return total / Double(numbers.count) | |
} | |
arithmeticMean(1, 2, 3, 4, 5) | |
func alignRight(var string: String, totalLength: Int, pad: Character) -> String { | |
return "" | |
} | |
func addTwoInts(a: Int, b: Int) -> Int { | |
return a + b | |
} | |
var mathFunction: (Int, Int) -> Int = addTwoInts | |
println("Result: \(mathFunction(2, 3))") | |
func printMathResult(mathFunction: (Int, Int) -> Int, a: Int, b: Int) { | |
println("Result: \(mathFunction(a, b))") | |
} | |
printMathResult(addTwoInts, 3, 5) | |
func stepForward(input: Int) -> Int { | |
return input + 1 | |
} | |
func stepBackward(input: Int) -> Int { | |
return input - 1 | |
} | |
func chooseStepFunction(backwards: Bool) -> (Int) -> Int { | |
return backwards ? stepBackward : stepForward | |
} | |
var currentValue = 3 | |
let moveNearerToZero = chooseStepFunction(currentValue > 0) | |
println("Counting to zero:") | |
// Counting to zero: | |
while currentValue != 0 { | |
println("\(currentValue)... ") | |
currentValue = moveNearerToZero(currentValue) | |
} | |
println("zero!") | |
func chooseStepFunction2(backwards: Bool) -> (Int) -> Int { | |
func stepForward(input: Int) -> Int { return input + 1 } | |
func stepBackward(input: Int) -> Int { return input - 1 } | |
return backwards ? stepBackward : stepForward | |
} | |
sorted(names, { (s1: String, s2: String) -> Bool in | |
return s1 > s2 | |
}) | |
sorted(names, { s1, s2 in return s1 > s2 } ) | |
sorted(names, { s1, s2 in s1 > s2 } ) | |
sorted(names, { $0 > $1 } ) | |
sorted(names, >) | |
func a1(x: Int, y: Int) -> Int { return x + y } | |
let a2 = { (x: Int, y: Int) in x + y } | |
func someFunctionThatTakesAClosure(closure: () -> ()) { | |
// function body goes here | |
} | |
someFunctionThatTakesAClosure({ | |
// closure's body goes here | |
}) | |
someFunctionThatTakesAClosure() { | |
// trailing closure's body goes here | |
} | |
let digitNames = [ | |
0: "Zero", 1: "One", 2: "Two", 3: "Three", 4: "Four", | |
5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine" | |
] | |
let numbers = [16, 58, 510] | |
let strings = numbers.map { | |
(var number) -> String in | |
var output = "" | |
while number > 0 { | |
output = digitNames[number % 10]! + output | |
number /= 10 | |
} | |
return output | |
} | |
println(strings) | |
enum CompassPoint { | |
case North | |
case South | |
case East | |
case West | |
} | |
enum Planets { | |
case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune | |
} | |
var directionToHead = CompassPoint.West | |
directionToHead = .East | |
directionToHead = .South | |
switch directionToHead { | |
case .North: | |
println("Lots of planets have a north") | |
case .South: | |
println("Watch out for penguins") | |
case .East: | |
println("Where the sun rises") | |
case .West: | |
println("Where the skies are blue") | |
} | |
let somePlanet = Planets.Earth | |
switch somePlanet { | |
case .Earth: | |
println("Mostly harmless") | |
default: | |
println("Not a safe place for humans") | |
} | |
enum Barcode { | |
case UPCA(Int, Int, Int, Int) | |
case QRCode(String) | |
} | |
var productBarcode = Barcode.UPCA(8, 85909, 51226, 3) | |
productBarcode = .QRCode("ABCDEFGHIJKLMNOP") | |
switch productBarcode { | |
case .UPCA(let numberSystem, let manufacturer, let product, let check): | |
println("UPC-A: \(numberSystem), \(manufacturer), \(product), \(check).") | |
case .QRCode(let productCode): | |
println("QR code: \(productCode).") | |
} | |
switch productBarcode { | |
case let .UPCA(numberSystem, manufacturer, product, check): | |
println("UPC-A: \(numberSystem), \(manufacturer), \(product), \(check).") | |
case let .QRCode(productCode): | |
println("QR code: \(productCode).") | |
} | |
enum ASCIIControlCharacter: Character { | |
case Tab = "\t" | |
case LineFeed = "\n" | |
case CarriageReturn = "\r" | |
} | |
enum Planet: Int { | |
case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune | |
} | |
let earthsOrder = Planet.Earth.rawValue | |
let possiblePlanet = Planet(rawValue: 7) | |
let positionToFind = 9 | |
if let somePlanet = Planet(rawValue: positionToFind) { | |
switch somePlanet { | |
case .Earth: | |
println("Mostly harmless") | |
default: | |
println("Not a safe place for humans") | |
} | |
} else { | |
println("There isn't a planet at position \(positionToFind)") | |
} | |
struct Resolution { | |
var width = 0 | |
var height = 0 | |
} | |
class VideoMode { | |
var resolution = Resolution() | |
var interlaced = false | |
var frameRate = 0.0 | |
var name: String? | |
} | |
struct FixedLengthRange { | |
var firstValue: Int | |
let length: Int | |
} | |
class DataImporter { | |
var fileName = "data.txt" | |
} | |
class DataManager { | |
lazy var importer = DataImporter() | |
var data = [String]() | |
} | |
struct Point { | |
var x = 0.0, y = 0.0 | |
} | |
struct Size { | |
var width = 0.0, height = 0.0 | |
} | |
struct Rect { | |
var origin = Point() | |
var size = Size() | |
var center: Point { | |
get { | |
let centerX = origin.x + (size.width / 2) | |
let centerY = origin.y + (size.height / 2) | |
return Point(x: centerX, y: centerY) | |
} | |
set(newCenter) { | |
origin.x = newCenter.x - (size.width / 2) | |
origin.y = newCenter.y - (size.height / 2) | |
} | |
} | |
} | |
var square2 = Rect(origin: Point(x: 0.0, y: 0.0), size: Size(width: 10.0, height: 10.0)) | |
let initialSquareCenter = square2.center | |
square2.center = Point(x: 15.0, y: 15.0) | |
println("square.origin is now at (\(square2.origin.x), \(square2.origin.y))") | |
struct AlternativeRect { | |
var origin = Point() | |
var size = Size() | |
var center: Point { | |
get { | |
let centerX = origin.x + (size.width / 2) | |
let centerY = origin.y + (size.height / 2) | |
return Point(x: centerX, y: centerY) | |
} | |
set { | |
origin.x = newValue.x - (size.width / 2) | |
origin.y = newValue.y - (size.height / 2) | |
} | |
} | |
} | |
struct Cuboid { | |
var width = 0.0, height = 0.0, depth = 0.0 | |
var volume: Double { | |
return width * height * depth | |
} | |
} | |
let fourByFiveByTwo = Cuboid(width: 4.0, height: 5.0, depth: 2.0) | |
println("the volume of fourByFiveByTwo is \(fourByFiveByTwo.volume)") | |
class StepCounter { | |
var totalSteps: Int = 0 { | |
willSet(newTotalSteps) { | |
println("About to set totalSteps to \(newTotalSteps)") | |
} | |
didSet { | |
if totalSteps > oldValue { | |
println("Added \(totalSteps - oldValue) steps") | |
} | |
} | |
} | |
} | |
let stepCounter = StepCounter() | |
stepCounter.totalSteps = 200 | |
struct SomeStructure { | |
static var storedTypeProperty = "Some value." | |
static var computedTypeProperty: Int { | |
return 0 | |
} | |
} | |
enum SomeEnumeration { | |
static var storedTypeProperty = "Some value." | |
static var computedTypeProperty: Int { | |
return 0 | |
} | |
} | |
class SomeClass { | |
static var storedTypeProperty = "Some value." | |
static var computedTypeProperty: Int { | |
return 1 | |
} | |
class var overrideableComputedTypeProperty: Int { | |
return 2 | |
} | |
} | |
struct AudioChannel { | |
static let thresholdLevel = 10 | |
static var maxInputLevelForAllChannels = 0 | |
var currentLevel: Int = 0 { | |
didSet { | |
if currentLevel > AudioChannel.thresholdLevel { | |
// cap the new audio level to the threshold level | |
currentLevel = AudioChannel.thresholdLevel | |
} | |
if currentLevel > AudioChannel.maxInputLevelForAllChannels { | |
// store this as the new overall maximum input level | |
AudioChannel.maxInputLevelForAllChannels = currentLevel | |
} | |
} | |
} | |
} | |
class Counter { | |
var count = 0 | |
func increment() { | |
++count | |
} | |
func incrementBy(amount: Int) { | |
count += amount | |
} | |
func reset() { | |
count = 0 | |
} | |
} | |
class Counter2 { | |
var count: Int = 0 | |
func incrementBy(amount: Int, numberOfTimes: Int) { | |
count += amount * numberOfTimes | |
} | |
} | |
let counter2 = Counter2() | |
counter2.incrementBy(5, numberOfTimes: 3) | |
struct Point2 { | |
var x = 0.0, y = 0.0 | |
func isToTheRightOfX(x: Double) -> Bool { | |
return self.x > x | |
} | |
} | |
let somePoint2 = Point2(x: 4.0, y: 5.0) | |
if somePoint2.isToTheRightOfX(1.0) { | |
println("This point is to the right of the line where x == 1.0") | |
} | |
struct Point3 { | |
var x = 0.0, y = 0.0 | |
mutating func moveByX(deltaX: Double, y deltaY: Double) { | |
x += deltaX | |
y += deltaY | |
} | |
mutating func moveByX2(deltaX: Double, y deltaY: Double) { | |
self = Point3(x: x + deltaX, y: y + deltaY) | |
} | |
} | |
var somePoint3 = Point3(x: 1.0, y: 1.0) | |
somePoint3.moveByX(2.0, y: 3.0) | |
println("The point is now at (\(somePoint3.x), \(somePoint3.y))") | |
class SomeClassA { | |
class func someTypeMethod() { | |
// type method implementation goes here | |
} | |
} | |
SomeClassA.someTypeMethod() | |
struct LevelTracker { | |
static var highestUnlockedLevel = 1 | |
static func unlockLevel(level: Int) { | |
if level > highestUnlockedLevel { highestUnlockedLevel = level } | |
} | |
static func levelIsUnlocked(level: Int) -> Bool { | |
return level <= highestUnlockedLevel | |
} | |
var currentLevel = 1 | |
mutating func advanceToLevel(level: Int) -> Bool { | |
if LevelTracker.levelIsUnlocked(level) { | |
currentLevel = level | |
return true | |
} else { | |
return false | |
} | |
} | |
} | |
class Player { | |
var tracker = LevelTracker() | |
let playerName: String | |
func completedLevel(level: Int) { | |
LevelTracker.unlockLevel(level + 1) | |
tracker.advanceToLevel(level + 1) | |
} | |
init(name: String) { | |
playerName = name | |
} | |
} | |
struct TimesTable { | |
let multiplier: Int | |
subscript(index: Int) -> Int { | |
return multiplier * index | |
} | |
} | |
let threeTimesTable = TimesTable(multiplier: 3) | |
println("six times three is \(threeTimesTable[6])") | |
struct Matrix { | |
let rows: Int, columns: Int | |
var grid: [Double] | |
init(rows: Int, columns: Int) { | |
self.rows = rows | |
self.columns = columns | |
grid = Array(count: rows * columns, repeatedValue: 0.0) | |
} | |
func indexIsValidForRow(row: Int, column: Int) -> Bool { | |
return row >= 0 && row < rows && column >= 0 && column < columns | |
} | |
subscript(row: Int, column: Int) -> Double { | |
get { | |
assert(indexIsValidForRow(row, column: column), "Index out of range") | |
return grid[(row * columns) + column] | |
} | |
set { | |
assert(indexIsValidForRow(row, column: column), "Index out of range") | |
grid[(row * columns) + column] = newValue | |
} | |
} | |
} | |
var matrix = Matrix(rows: 2, columns: 2) | |
matrix[0, 1] = 1.5 | |
matrix[1, 0] = 3.2 | |
class Vehicle { | |
var currentSpeed = 0.0 | |
var description: String { | |
return "traveling at \(currentSpeed) miles per hour" | |
} | |
func makeNoise() { | |
// do nothing - an arbitrary vehicle doesn't necessarily make a noise | |
} | |
} | |
class Bicycle: Vehicle { | |
var hasBasket = false | |
} | |
class Train: Vehicle { | |
override func makeNoise() { | |
println("Choo Choo") | |
} | |
} | |
class Car: Vehicle { | |
var gear = 1 | |
override var description: String { | |
return super.description + " in gear \(gear)" | |
} | |
} | |
class AutomaticCar: Car { | |
override var currentSpeed: Double { | |
didSet { | |
gear = Int(currentSpeed / 10.0) + 1 | |
} | |
} | |
} | |
struct Fahrenheit { | |
var temperature: Double | |
init() { | |
temperature = 32.0 | |
} | |
} | |
var f = Fahrenheit() | |
println("The default temperature is \(f.temperature)° Fahrenheit") | |
struct Celsius { | |
var temperatureInCelsius: Double | |
init(fromFahrenheit fahrenheit: Double) { | |
temperatureInCelsius = (fahrenheit - 32.0) / 1.8 | |
} | |
init(fromKelvin kelvin: Double) { | |
temperatureInCelsius = kelvin - 273.15 | |
} | |
} | |
let boilingPointOfWater = Celsius(fromFahrenheit: 212.0) | |
// boilingPointOfWater.temperatureInCelsius is 100.0 | |
let freezingPointOfWater = Celsius(fromKelvin: 273.15) | |
struct Color { | |
let red, green, blue: Double | |
init(red: Double, green: Double, blue: Double) { | |
self.red = red | |
self.green = green | |
self.blue = blue | |
} | |
init(white: Double) { | |
red = white | |
green = white | |
blue = white | |
} | |
} | |
struct Celsius2 { | |
var temperatureInCelsius: Double | |
init(fromFahrenheit fahrenheit: Double) { | |
temperatureInCelsius = (fahrenheit - 32.0) / 1.8 | |
} | |
init(fromKelvin kelvin: Double) { | |
temperatureInCelsius = kelvin - 273.15 | |
} | |
init(_ celsius: Double) { | |
temperatureInCelsius = celsius | |
} | |
} | |
let bodyTemperature = Celsius2(37.0) | |
class SurveyQuestion { | |
var text: String | |
var response: String? | |
init(text: String) { | |
self.text = text | |
} | |
func ask() { | |
println(text) | |
} | |
} | |
struct Rect2 { | |
var origin = Point() | |
var size = Size() | |
init() {} | |
init(origin: Point, size: Size) { | |
self.origin = origin | |
self.size = size | |
} | |
init(center: Point, size: Size) { | |
let originX = center.x - (size.width / 2) | |
let originY = center.y - (size.height / 2) | |
self.init(origin: Point(x: originX, y: originY), size: size) | |
} | |
} | |
class Food { | |
var name: String | |
init(name: String) { | |
self.name = name | |
} | |
convenience init() { | |
self.init(name: "[Unnamed]") | |
} | |
} | |
class RecipeIngredient: Food { | |
var quantity: Int | |
init(name: String, quantity: Int) { | |
self.quantity = quantity | |
super.init(name: name) | |
} | |
override convenience init(name: String) { | |
self.init(name: name, quantity: 1) | |
} | |
} | |
struct Animal { | |
let species: String | |
init?(species: String) { | |
if species.isEmpty { return nil } | |
self.species = species | |
} | |
} | |
enum TemperatureUnit { | |
case Kelvin, Celsius, Fahrenheit | |
init?(symbol: Character) { | |
switch symbol { | |
case "K": | |
self = .Kelvin | |
case "C": | |
self = .Celsius | |
case "F": | |
self = .Fahrenheit | |
default: | |
return nil | |
} | |
} | |
} | |
class SomeClass3 { | |
required init() { | |
// initializer implementation goes here | |
} | |
} | |
class SomeClass4 { | |
let someProperty: Int = { | |
// create a default value for someProperty inside this closure | |
// someValue must be of the same type as SomeType | |
return 12 | |
}() | |
deinit { | |
} | |
} | |
class Person { | |
var residence: Residence? | |
} | |
class Residence { | |
var numberOfRooms = 1 | |
} | |
let john = Person() | |
john.residence = Residence() | |
let roomCount = john.residence!.numberOfRooms | |
if let roomCount = john.residence?.numberOfRooms { | |
println("John's residence has \(roomCount) room(s).") | |
} else { | |
println("Unable to retrieve the number of rooms.") | |
} | |
var testScores = ["Dave": [86, 82, 84], "Bev": [79, 94, 81]] | |
testScores["Dave"]?[0] = 91 | |
testScores["Bev"]?[0]++ | |
testScores["Brian"]?[0] = 72 | |
class MediaItem { | |
var name: String | |
init(name: String) { | |
self.name = name | |
} | |
} | |
class Movie: MediaItem { | |
var director: String | |
init(name: String, director: String) { | |
self.director = director | |
super.init(name: name) | |
} | |
} | |
class Song: MediaItem { | |
var artist: String | |
init(name: String, artist: String) { | |
self.artist = artist | |
super.init(name: name) | |
} | |
} | |
let library = [ | |
Movie(name: "Casablanca", director: "Michael Curtiz"), | |
Song(name: "Blue Suede Shoes", artist: "Elvis Presley"), | |
Movie(name: "Citizen Kane", director: "Orson Welles"), | |
Song(name: "The One And Only", artist: "Chesney Hawkes"), | |
Song(name: "Never Gonna Give You Up", artist: "Rick Astley") | |
] | |
var movieCount = 0 | |
var songCount = 0 | |
for item in library { | |
if item is Movie { | |
++movieCount | |
} else if item is Song { | |
++songCount | |
} | |
} | |
println("Media library contains \(movieCount) movies and \(songCount) songs") | |
for item in library { | |
if let movie = item as? Movie { | |
println("Movie: '\(movie.name)', dir. \(movie.director)") | |
} else if let song = item as? Song { | |
println("Song: '\(song.name)', by \(song.artist)") | |
} | |
} | |
let someObjects: [AnyObject] = [ | |
Movie(name: "2001: A Space Odyssey", director: "Stanley Kubrick"), | |
Movie(name: "Moon", director: "Duncan Jones"), | |
Movie(name: "Alien", director: "Ridley Scott") | |
] | |
for object in someObjects { | |
let movie = object as! Movie | |
println("Movie: '\(movie.name)', dir. \(movie.director)") | |
} | |
struct BlackjackCard { | |
// nested Suit enumeration | |
enum Suit: Character { | |
case Spades = "♠", Hearts = "♡", Diamonds = "♢", Clubs = "♣" | |
} | |
// nested Rank enumeration | |
enum Rank: Int { | |
case Two = 2, Three, Four, Five, Six, Seven, Eight, Nine, Ten | |
case Jack, Queen, King, Ace | |
struct Values { | |
let first: Int, second: Int? | |
} | |
var values: Values { | |
switch self { | |
case .Ace: | |
return Values(first: 1, second: 11) | |
case .Jack, .Queen, .King: | |
return Values(first: 10, second: nil) | |
default: | |
return Values(first: self.rawValue, second: nil) | |
} | |
} | |
} | |
// BlackjackCard properties and methods | |
let rank: Rank, suit: Suit | |
var description: String { | |
var output = "suit is \(suit.rawValue)," | |
output += " value is \(rank.values.first)" | |
if let second = rank.values.second { | |
output += " or \(second)" | |
} | |
return output | |
} | |
} | |
let theAceOfSpades = BlackjackCard(rank: .Ace, suit: .Spades) | |
println("theAceOfSpades: \(theAceOfSpades.description)") | |
let heartsSymbol = BlackjackCard.Suit.Hearts.rawValue | |
extension Double { | |
var km: Double { return self * 1_000.0 } | |
var m: Double { return self } | |
var cm: Double { return self / 100.0 } | |
var mm: Double { return self / 1_000.0 } | |
var ft: Double { return self / 3.28084 } | |
} | |
let oneInch = 25.4.mm | |
println("One inch is \(oneInch) meters") | |
extension Rect { | |
init(center: Point, size: Size) { | |
let originX = center.x - (size.width / 2) | |
let originY = center.y - (size.height / 2) | |
self.init(origin: Point(x: originX, y: originY), size: size) | |
} | |
} | |
extension Int { | |
func repetitions(task: () -> ()) { | |
for _ in 0..<self { | |
task() | |
} | |
} | |
} | |
extension Int { | |
subscript(var digitIndex: Int) -> Int { | |
var decimalBase = 1 | |
while digitIndex > 0 { | |
decimalBase *= 10 | |
--digitIndex | |
} | |
return (self / decimalBase) % 10 | |
} | |
} | |
extension Int { | |
enum Kind { | |
case Negative, Zero, Positive | |
} | |
var kind: Kind { | |
switch self { | |
case 0: | |
return .Zero | |
case let x where x > 0: | |
return .Positive | |
default: | |
return .Negative | |
} | |
} | |
} | |
func printIntegerKinds(numbers: [Int]) { | |
for number in numbers { | |
switch number.kind { | |
case .Negative: | |
print("- ") | |
case .Zero: | |
print("0 ") | |
case .Positive: | |
print("+ ") | |
} | |
} | |
print("\n") | |
} | |
printIntegerKinds([3, 19, -27, 0, -6, 0, 7]) | |
protocol SomeProtocol { | |
var mustBeSettable: Int { get set } | |
var doesNotNeedToBeSettable: Int { get } | |
} | |
protocol AnotherProtocol { | |
static var someTypeProperty: Int { get set } | |
} | |
protocol FullyNamed { | |
var fullName: String { get } | |
} | |
struct PersonA: FullyNamed { | |
var fullName: String | |
} | |
let jonny = PersonA(fullName: "John Appleseed") | |
protocol SomeProtocolB { | |
static func someTypeMethod() | |
} | |
protocol RandomNumberGenerator { | |
func random() -> Double | |
} | |
class LinearCongruentialGenerator: RandomNumberGenerator { | |
var lastRandom = 42.0 | |
let m = 139968.0 | |
let a = 3877.0 | |
let c = 29573.0 | |
func random() -> Double { | |
lastRandom = ((lastRandom * a + c) % m) | |
return lastRandom / m | |
} | |
} | |
let generator = LinearCongruentialGenerator() | |
println("Here's a random number: \(generator.random())") | |
protocol Togglable { | |
mutating func toggle() | |
} | |
enum OnOffSwitch: Togglable { | |
case Off, On | |
mutating func toggle() { | |
switch self { | |
case Off: | |
self = On | |
case On: | |
self = Off | |
} | |
} | |
} | |
var lightSwitch = OnOffSwitch.Off | |
lightSwitch.toggle() | |
protocol SomeProtocolC { | |
init(someParameter: Int) | |
} | |
class SomeClassC: SomeProtocolC { | |
required init(someParameter: Int) { | |
// initializer implementation goes here | |
} | |
} | |
protocol SomeInheritedProtocol {} | |
protocol SomeClassOnlyProtocol: class, SomeInheritedProtocol { | |
// class-only protocol definition goes here | |
} | |
protocol Named { | |
var name: String { get } | |
} | |
protocol Aged { | |
var age: Int { get } | |
} | |
struct PersonB: Named, Aged { | |
var name: String | |
var age: Int | |
} | |
func wishHappyBirthday(celebrator: protocol<Named, Aged>) { | |
println("Happy birthday \(celebrator.name) - you're \(celebrator.age)!") | |
} | |
let birthdayPerson = PersonB(name: "Malcolm", age: 21) | |
wishHappyBirthday(birthdayPerson) | |
@objc protocol CounterDataSource { | |
optional func incrementForCount(count: Int) -> Int | |
optional var fixedIncrement: Int { get } | |
} | |
@objc class Counter3 { | |
var count = 0 | |
var dataSource: CounterDataSource? | |
func increment() { | |
if let amount = dataSource?.incrementForCount?(count) { | |
count += amount | |
} else if let amount = dataSource?.fixedIncrement { | |
count += amount | |
} | |
} | |
} | |
func swapTwoValues<T>(inout a: T, inout b: T) { | |
let temporaryA = a | |
a = b | |
b = temporaryA | |
} | |
var someInt = 3 | |
var anotherInt = 107 | |
swapTwoValues(&someInt, &anotherInt) | |
// someInt is now 107, and anotherInt is now 3 | |
var someString = "hello" | |
var anotherString = "world" | |
swapTwoValues(&someString, &anotherString) | |
struct Stack<T> { | |
var items = [T]() | |
mutating func push(item: T) { | |
items.append(item) | |
} | |
mutating func pop() -> T { | |
return items.removeLast() | |
} | |
} | |
var stackOfStrings = Stack<String>() | |
stackOfStrings.push("uno") | |
stackOfStrings.push("dos") | |
stackOfStrings.push("tres") | |
stackOfStrings.push("cuatro") | |
func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) { | |
// function body goes here | |
} | |
protocol Container { | |
typealias ItemType | |
mutating func append(item: ItemType) | |
var count: Int { get } | |
subscript(i: Int) -> ItemType { get } | |
} | |
func allItemsMatch< | |
C1: Container, C2: Container | |
where C1.ItemType == C2.ItemType, C1.ItemType: Equatable> | |
(someContainer: C1, anotherContainer: C2) -> Bool { | |
// check that both containers contain the same number of items | |
if someContainer.count != anotherContainer.count { | |
return false | |
} | |
// check each pair of items to see if they are equivalent | |
for i in 0..<someContainer.count { | |
if someContainer[i] != anotherContainer[i] { | |
return false | |
} | |
} | |
// all items match, so return true | |
return true | |
} | |
let initialBits: UInt8 = 0b00001111 | |
let invertedBits = ~initialBits | |
let firstSixBits: UInt8 = 0b11111100 | |
let lastSixBits: UInt8 = 0b00111111 | |
let middleFourBits = firstSixBits & lastSixBits | |
let someBits: UInt8 = 0b10110010 | |
let moreBits: UInt8 = 0b01011110 | |
let combinedbits = someBits | moreBits | |
let firstBits: UInt8 = 0b00010100 | |
let otherBits: UInt8 = 0b00000101 | |
let outputBits = firstBits ^ otherBits | |
let pink: UInt32 = 0xCC6699 | |
let redComponent = (pink & 0xFF0000) >> 16 // redComponent is 0xCC, or 204 | |
let greenComponent = (pink & 0x00FF00) >> 8 // greenComponent is 0x66, or 102 | |
let blueComponent = pink & 0x0000FF // blueComponent is 0x99, or 153 | |
var unsignedOverflow = UInt8.max | |
unsignedOverflow = unsignedOverflow &+ 1 | |
unsignedOverflow = UInt8.min | |
unsignedOverflow = unsignedOverflow &- 1 | |
struct Vector2D { | |
var x = 0.0, y = 0.0 | |
} | |
func + (left: Vector2D, right: Vector2D) -> Vector2D { | |
return Vector2D(x: left.x + right.x, y: left.y + right.y) | |
} | |
let vector = Vector2D(x: 3.0, y: 1.0) | |
let anotherVector = Vector2D(x: 2.0, y: 4.0) | |
let combinedVector = vector + anotherVector | |
func += (inout left: Vector2D, right: Vector2D) { | |
left = left + right | |
} | |
prefix func - (vector: Vector2D) -> Vector2D { | |
return Vector2D(x: -vector.x, y: -vector.y) | |
} | |
prefix func ++ (inout vector: Vector2D) -> Vector2D { | |
vector += Vector2D(x: 1.0, y: 1.0) | |
return vector | |
} | |
func == (left: Vector2D, right: Vector2D) -> Bool { | |
return (left.x == right.x) && (left.y == right.y) | |
} | |
func != (left: Vector2D, right: Vector2D) -> Bool { | |
return !(left == right) | |
} | |
let twoThree = Vector2D(x: 2.0, y: 3.0) | |
let anotherTwoThree = Vector2D(x: 2.0, y: 3.0) | |
if twoThree == anotherTwoThree { | |
println("These two vectors are equivalent.") | |
} | |
prefix operator +++ {} | |
prefix func +++ (inout vector: Vector2D) -> Vector2D { | |
vector += vector | |
return vector | |
} | |
var toBeDoubled = Vector2D(x: 1.0, y: 4.0) | |
let afterDoubling = +++toBeDoubled | |
infix operator +- { associativity left precedence 140 } | |
func +- (left: Vector2D, right: Vector2D) -> Vector2D { | |
return Vector2D(x: left.x + right.x, y: left.y - right.y) | |
} | |
let firstVector = Vector2D(x: 1.0, y: 2.0) | |
let secondVector = Vector2D(x: 3.0, y: 4.0) | |
let plusMinusVector = firstVector +- secondVector | |
public class SomePublicClass { // explicitly public class | |
public var somePublicProperty = 0 // explicitly public class member | |
var someInternalProperty = 0 // implicitly internal class member | |
private func somePrivateMethod() {} // explicitly private class member | |
} | |
class SomeInternalClass { // implicitly internal class | |
var someInternalProperty = 0 // implicitly internal class member | |
private func somePrivateMethod() {} // explicitly private class member | |
} | |
private class SomePrivateClass { // explicitly private class | |
var somePrivateProperty = 0 // implicitly private class member | |
func somePrivateMethod() {} // implicitly private class member | |
} | |
public class A { | |
private func someMethod() {} | |
} | |
internal class B: A { | |
override internal func someMethod() { | |
super.someMethod() | |
} | |
} | |
struct TrackedString { | |
private(set) var numberOfEdits = 0 | |
var value: String = "" { | |
didSet { | |
numberOfEdits++ | |
} | |
} | |
} | |
public struct TrackedString2 { | |
public private(set) var numberOfEdits = 0 | |
public var value: String = "" { | |
didSet { | |
numberOfEdits++ | |
} | |
} | |
public init() {} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment