Skip to content

Instantly share code, notes, and snippets.

@regnerjr
Last active August 29, 2015 14:04
Show Gist options
  • Save regnerjr/c2c2c40d15432e2efae6 to your computer and use it in GitHub Desktop.
Save regnerjr/c2c2c40d15432e2efae6 to your computer and use it in GitHub Desktop.
iOS Programming: Chapter 2 in Swift
//
// BNRItem.swift
// Created by John Regner on 7/28/14.
//
import Foundation
extension Array {
func randomItem() -> T {
let random = Int(arc4random()) % self.count
return self[random]
}
}
class BNRItem : NSObject{
var itemName: String
var serialNumber: String
var valueInDollars: Int
var dateCreated: NSDate
override var description: String{
get{
return "\(itemName) (\(serialNumber)): Worth $\(valueInDollars), recorded on \(dateCreated)"
}
}
init(WithItemName name: String, valueInDollars: Int, serialNumber: String ){
self.itemName = name
self.valueInDollars = valueInDollars
self.serialNumber = serialNumber
self.dateCreated = NSDate.date()
super.init()
}
convenience init(WithItemName name: String, serialNumber: String){
self.init(WithItemName: name, valueInDollars: 0, serialNumber: serialNumber)
}
class func randomItem () -> BNRItem {
let randomAdjectiveList = ["Fluffy", "Rusty", "Shiny"]
let randomNounList = ["Bear", "Spork", "Mac"]
let adjectiveIndex = randomNumberLessThan(randomAdjectiveList.count)
let nounIndex = randomNumberLessThan(randomNounList.count)
let randomName = randomAdjectiveList[adjectiveIndex] + randomNounList[nounIndex]
let randomValue = randomNumberLessThan(100)
let numbers = arrayOfZeroThroughNine()
let chars = arrayOfAThroughZ()
let randomSerialNumber =
"\(numbers.randomItem())\(chars.randomItem())\(numbers.randomItem())\(chars.randomItem())\(numbers.randomItem())"
return BNRItem(WithItemName: randomName, valueInDollars: randomValue, serialNumber: randomSerialNumber)
}
}
func arrayOfZeroThroughNine() -> [String] {
retrun Array(0...9).map{ String($0) }
}
func arrayOfAThroughZ() -> [String] {
//ascii 'a' is code point 0x61 => 97, 'z' is 0x7A
return chars = Array(0x61...0x7A).map { String(UnicodeScalar($0)) }
}
class BNRContainer : BNRItem {
//properly written can contain instances of BNRContainer
var subItems = [BNRItem]()
var collectionValue: Int { //calculated property must be declared as var
var sum: Int = 0
for item in subItems {
if let container = item as? BNRContainer {
sum += container.collectionValue
sum += container.valueInDollars
}
else { //else item is just a BNRItem
sum += item.valueInDollars
}
}
return sum
}
init(WithContainerName name: String){
super.init(WithItemName: name, valueInDollars: 0, serialNumber: "")
}
func addItem(item:BNRItem) -> (){
subItems += item
}
func description() -> String {
//returns the container name and value in dollars, and list of items
var items: String = ""
for item in subItems {
items += item.itemName
items += " "
}
return "Container: \(itemName)\nValue: \(collectionValue)\nWith Items: \(items)"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment