Upload
mindfire-solutions
View
175
Download
1
Tags:
Embed Size (px)
Citation preview
What you will learn
Presenter: Waseem Ahmad, Mindfire Solutions
What is Swift?VariableConstants Type InferenceType AliasesString/Character InterpolationArray and DictionaryLoopsOptionals, Unwrapping an OptionalFunctionsTuplesClassesPropertiesClosuresQ & A
What is Swift ?
• Swift is Apple’s modern, type-safe language for Cocoa development that builds on the best of C and Objective-C
• Safe• Modern• Power
Presenter: Waseem Ahmad, Mindfire Solutions
Variables
var variableName : String = “Swift”var version: Double = 1.0var day: Int = 28var isAnimated: Bool = true
Presenter: Waseem Ahmad, Mindfire Solutions
Constants & Variables
let variableName: String = “Swift”var version: Double = 1.0var day: Int = 28var isAnimated: Bool = true
Pretty clear which is constant and mutable, it’s define safe code in multithreaded environment. Make code more clear and readable.
Presenter: Waseem Ahmad, Mindfire Solutions
Constants & Variables
let variableName: String = “Swift”var version: Double = 1.0let day: Int = 28let isAnimated: Bool = true
Presenter: Waseem Ahmad, Mindfire Solutions
Type Inference
let variableName = “Swift” // As Stringvar version = 1.0 // As Double/Floatlet day = 28 // As Intlet isAnimated = true // As Boolean
Code safe, these are valuable & constant explicitly type.
Presenter: Waseem Ahmad, Mindfire Solutions
Type Aliases
An alternative name for an existing type.
typealias AudioSample = UInt16
var maxAmplitudeFound = AudioSample.min
Presenter: Waseem Ahmad, Mindfire Solutions
Unicode Names
let variableName = “Swift” // As Stringvar version = 1.0 // As Double/Floatlet day = 28 // As Intlet isAnimated = true // As Booleanlet π = 3.1415927let � = "emoji"�
Presenter: Waseem Ahmad, Mindfire Solutions
String
var studentName: String = “Waseem” var studentName = “Waseem” // Inferred to be of type string
Presenter: Waseem Ahmad, Mindfire Solutions
String
var studentName: String = “Waseem” var studentName = “Waseem” // Inferred to be of type string
var documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as StringdocumentsPath = documentsPath.stringByAppendingString(subpath)
Presenter: Waseem Ahmad, Mindfire Solutions
Character
let studentName = “Waseem"
for character in studentName { println(character)}
Waseem
Presenter: Waseem Ahmad, Mindfire Solutions
Complex String
var name = “Waseem”var coins = 100
Congratulations, Waseem won 100 coins.
Presenter: Waseem Ahmad, Mindfire Solutions
String Interpolation
var name = “Waseem”var coins = 100
Congratulations, Waseem won 100 coins.
let message = “Congratulations, \(name) won \(coins)”.
Presenter: Waseem Ahmad, Mindfire Solutions
String Mutability
var variableString = “Mindfire"variableString += " Solutions”
// variableString is now “Mindfire Solutions"
Presenter: Waseem Ahmad, Mindfire Solutions
String Mutability
var variableString = “Mindfire"variableString += " Solutions”
// variableString is now “Mindfire Solutions"
let constantString = “Mindfire"constantString += " Solutions”
// error - constantString cannot be changed
Presenter: Waseem Ahmad, Mindfire Solutions
String Mutability
var variableString = “Mindfire"variableString += " Solutions”
// variableString is now “Mindfire Solutions"
let constantString = “Mindfire"constantString += " Solutions”
// error - constantString cannot be changed
Presenter: Waseem Ahmad, Mindfire Solutions
Array and Dictionary Literalsvar names = [“John”, “Bob”, "Brian", "Jack"]
Presenter: Waseem Ahmad, Mindfire Solutions
Array and Dictionary Literalsvar names = [“John”, “Bob”, "Brian", “Jack"]var numberOfLegs = ["ant": 6, "snake": 0, "cheetah": 4]
Presenter: Waseem Ahmad, Mindfire Solutions
Difference Between NSArray & NSDictionary- It could work with any type (String, Int etc)- Collection are typed collection
Presenter: Waseem Ahmad, Mindfire Solutions
Typed Collectionvar names = [“John”, “Bob”, "Brian", “Jack”, 123]var names = [“John”, “Bob”, "Brian", “Jack”, function()]
Presenter: Waseem Ahmad, Mindfire Solutions
Typed Collectionvar names: String[] = [“John”, “Bob”, "Brian", “Jack”]
Presenter: Waseem Ahmad, Mindfire Solutions
Typed Collectionvar names = [“John”, “Bob”, "Brian", “Jack”]
// An array of String Values
var numberOfLegs = ["ant": 6, "snake": 0, "cheetah": 4]// An Dictionary With String Keys and Int Values
Typed collection made your code safe, you well know what you are retrieving and adding.
Presenter: Waseem Ahmad, Mindfire Solutions
Loopwhile !isTrue { print(“hello”)}
for var i = 1; i <= 13; ++i { print(“hello”)}
Presenter: Waseem Ahmad, Mindfire Solutions
For-In: Strings and Characterslet studentName = “Waseem"
for character in studentName { println(character)}
Waseem
Swift Power, we can use character & emoji in similar way.
Presenter: Waseem Ahmad, Mindfire Solutions
For-In: Rangesfor number in 1...5 { // Clause Range println("\(number) times 4 is \(number * 4)")}
1 times 4 is 42 times 4 is 83 times 4 is 124 times 4 is 165 times 4 is 20
Presenter: Waseem Ahmad, Mindfire Solutions
For-In: Rangesfor number in 0..5 { // half clause range println("\(number) times 4 is \(number * 4)")}
0 times 4 is 01 times 4 is 42 times 4 is 83 times 4 is 124 times 4 is 16
Presenter: Waseem Ahmad, Mindfire Solutions
For-In: Arrayvar names = [“John”, “Bob”, "Brian", "Jack"]
for name in names { println("Hello \(name)")}
Presenter: Waseem Ahmad, Mindfire Solutions
For-In: Dictionarieslet numberOfLegs = ["ant": 6, "snake": 0, "cheetah": 4]!for (animalName, legCount) in numberOfLegs { println("\(animalName)s have \(legCount) legs")}
ants have 6 legs
Power of swift extracting key and value in single loop, grouping of value is a power full feature of swift i.e Tuples
Presenter: Waseem Ahmad, Mindfire Solutions
Modification in Arrayvar shoppingList = ["Eggs", "Milk"]println(shoppingList[0])
Presenter: Waseem Ahmad, Mindfire Solutions
Modification in Arrayvar shoppingList = ["Eggs", "Milk"]println(shoppingList[0])
shoppingList += "Flour"shoppingList += ["Cheese", "Butter", "Chocolate Spread"]
Presenter: Waseem Ahmad, Mindfire Solutions
Modification in Arrayvar shoppingList = ["Eggs", "Milk"]
shoppingList += "Flour"shoppingList += ["Cheese", "Butter", "Chocolate Spread”]shoppingList[0] = "Six eggs"
Presenter: Waseem Ahmad, Mindfire Solutions
Modification in Arrayvar shoppingList = ["Eggs", "Milk"]
shoppingList += "Flour"shoppingList += ["Cheese", "Butter", "Chocolate Spread”]shoppingList[0] = "Six eggs”
["Six eggs", "Milk", "Flour", "Cheese", "Butter","Chocolate Spread"]
shoppingList[3...5] = ["Bananas", “Apples"]
["Six eggs", "Milk", "Flour", "Bananas", “Apples"]
Presenter: Waseem Ahmad, Mindfire Solutions
Modification in Dictionaryvar numberOfLegs = ["ant": 6, "snake": 0, "cheetah": 4]
numberOfLegs["spider"] = 273
Presenter: Waseem Ahmad, Mindfire Solutions
Modification in Dictionaryvar numberOfLegs = ["ant": 6, "snake": 0, "cheetah": 4]
numberOfLegs["spider"] = 273
numberOfLegs["spider"] = 8
What happen if we try to fetch a value that doesn’t have in array and dictionary?
let lionLegCount = numberOfLegs[“lion”] // Nothing at all :)
Presenter: Waseem Ahmad, Mindfire Solutions
Optionalvar numberOfLegs = ["ant": 6, "snake": 0, "cheetah": 4]
let lionLegCount: Int? = numberOfLegs["lion"]
Presenter: Waseem Ahmad, Mindfire Solutions
Optionalvar numberOfLegs = ["ant": 6, "snake": 0, "cheetah": 4]
let lionLegCount: Int? = numberOfLegs[“lion"]
if lionLegCount == nil { println("Lion wasn't found")} else { let legCount = lionLegCount! // unwrapping of optional value println("An lion has \(legCount) legs")}
Presenter: Waseem Ahmad, Mindfire Solutions
Optionalif numberOfLegs { let legCount = numberOfLegs! println("An Lion has \(legCount) legs")}
Presenter: Waseem Ahmad, Mindfire Solutions
Unwrapping an Optionalif let legCount = numberOfLegs { println("An Lion has \(legCount) legs")}
Note:- Braces are required with If :)
Presenter: Waseem Ahmad, Mindfire Solutions
Switchswitch legCount { case 0:
println("It slithers and slides around”)
case 1: println("It hops")
default: println("It walks")}
Presenter: Waseem Ahmad, Mindfire Solutions
Switchswitch sender { case executeButton:
println("You tapped the Execute button")
case firstNameTextField: println("You tapped the First Name text field")
default: println("You tapped some other object")}
Presenter: Waseem Ahmad, Mindfire Solutions
Switchswitch legCount { case 0:
println("It slithers and slides around")!
case 1, 3, 5, 7, 9, 11, 13: println("It limps")
case 2, 4, 6, 8, 10, 12, 14: println("It walks")}
// error: switch must be exhaustive
Presenter: Waseem Ahmad, Mindfire Solutions
Switchswitch legCount { case 0:
println("It slithers and slides around")!
case 1, 3, 5, 7, 9, 11, 13: println("It limps")
case 2, 4, 6, 8, 10, 12, 14: println("It walks”)
default: println("It walks")}
Presenter: Waseem Ahmad, Mindfire Solutions
Matching Value Rangesswitch legCount { case 0:
println("It slithers and slides around")!
case 1…8: println("It has few lags")
default: println("It walks")}
Presenter: Waseem Ahmad, Mindfire Solutions
Functions with Parametersfunc sayHello(name: String) { println("Hello \(name)!")}
Presenter: Waseem Ahmad, Mindfire Solutions
Default Parameter Valuesfunc sayHello(name: String = "World") { println("Hello \(name)!")}
sayHello() // Hello WorldsayHello(“Team”) // Hello Team
Presenter: Waseem Ahmad, Mindfire Solutions
Returning Valuesfunc greetingMsg(name: String = "World") -> String { return "Hello " + name}
let greeting = greetingMsg()
Presenter: Waseem Ahmad, Mindfire Solutions
Returning Multiple Valuesfunc getUsernInfo() -> (Int, String) { return (25, “John”)}
Presenter: Waseem Ahmad, Mindfire Solutions
Tuples-Grouping a values -Value could be any type
(3.79, 3.99, 4.19) // (Double, Double, Double)(404, "Not found")(2, "banana", 0.72)
-Tuple is not an replacement of structure but this is best when needs to return multiple values like from function
func getUsernInfo() -> (Int, String) { return (25, “John”)}
Presenter: Waseem Ahmad, Mindfire Solutions
Decomposing of Tuplesfunc getUsernInfo() -> (Int, String) { return (25, “John”)}
let (age, name) = getUsernInfo()
println(“This is \(name) and my age is \(age)")
Presenter: Waseem Ahmad, Mindfire Solutions
Decomposing of Tuplesfunc getUsernInfo() -> (Int, String) { return (25, “John”)}
let (age, name) = getUsernInfo()
let (age: Int, name: String) = getUsernInfo()
println(“This is \(name) and my age is \(age)")
If you only need some of the tuple’s values, ignore parts of the tuple with an underscore (_) when you decompose the tuple:
let (age, _) = getUsernInfo()
Presenter: Waseem Ahmad, Mindfire Solutions
Named Values in a Tuplefunc getUsernInfo() -> (age: Int, name: String) { return (25, “John”)}
let userInfo = getUsernInfo()
println(“This is \(userInfo.name) and my age is \(userInfo.age)”)
Presenter: Waseem Ahmad, Mindfire Solutions
Classesclass Student { // properties
// methods // initializers}
class Student: NSObject { // no need to derive a class with base as NSObject}
We can create a subclass and inherited
class Medical: Student {}
Presenter: Waseem Ahmad, Mindfire Solutions
Propertiesclass Student { var rollNo = 1
var name: String?
// methods // initializers}
The big difference between objective c and swift is “no difference between Instance variable and priorities”.
Here rollNo we can say as stored properties.
Presenter: Waseem Ahmad, Mindfire Solutions
Computed Propertiesclass Student { var rollNo = 1
var name: String?
var description: String { get {
return “Hi this \(name!) and my roll number is \(rollNo)“}
} }
Presenter: Waseem Ahmad, Mindfire Solutions
Computed Properties (RW)class Student { var rollNo = 1
var name: String?
var description: String { get {
return “Hi this \(name!) and my roll number is \(rollNo)“}set {}
} }
Presenter: Waseem Ahmad, Mindfire Solutions
Computed Properties (Read)class Student { var rollNo = 1
var name: String?
var description: String { return “Hi this \(name!) and my roll number is \(rollNo)“}
}
Presenter: Waseem Ahmad, Mindfire Solutions
Initializer Class Syntaxclass Student { var rollNo = 1var name: String?
var description: String { return “Hi this \(name!) and my roll number is \(rollNo)“} }
let studentObj = Student()println(studentObj.description)
- Automatic memory allocation-No need to write type as Swift support Type Inferencelet studentObj : Student = Student()
Presenter: Waseem Ahmad, Mindfire Solutions
Initializer Class Syntaxclass Student { var rollNo = 1
var name: String?
init() { // constructorstring = “Waseem”
}
var description: String { return “Hi this \(name!) and my roll number is \(rollNo)“}
}
Presenter: Waseem Ahmad, Mindfire Solutions
Overriding a Propertyclass Medical: Student { init() { super.init() } override var description: String { // Safe return super.description + ", student of Medical" }}
Presenter: Waseem Ahmad, Mindfire Solutions
Property Observersclass Loan: Bank { override var intrest: Double {
willSet { // newValue is available here
if intrest > 10.0 {// calculate // trigger
}}
}didSet {
// oldValue is available here}
} }
Presenter: Waseem Ahmad, Mindfire Solutions
Methodsclass Student { var rollNo = 1
var name: String?
func studentName(nameStr: String) { name = nameStr
}}
Presenter: Waseem Ahmad, Mindfire Solutions
Class Methodsclass func isFileExistAtPath(filePath: NSString) -> Bool {
let filemanager = NSFileManager.defaultManager()return filemanager.fileExistsAtPath(filePath)
}
Presenter: Waseem Ahmad, Mindfire Solutions
Class De-initialisationclass Student { var rollNo = 1
var name: String?
init() { // constructorfileOpen() //
}
deinit { // constructorcloseFile() //
}}
Presenter: Waseem Ahmad, Mindfire Solutions
iPhone App to Advertise Real Estate
Case Study
www.mindfiresolutions.com
Next Seminar: Swift in depthClosuresStructuresEnumExtensionsMemory ManagementOptional ChainingGeneric type
Presenter: Waseem Ahmad, Mindfire Solutions
References- Apple WWDC 2014- Apple Inc. “The Swift Programming Language.” iBooks.
Presenter: Waseem Ahmad, Mindfire Solutions