45
Введение в Swift

Intro to Swift techitout

Embed Size (px)

Citation preview

Page 1: Intro to Swift techitout

Введение в Swift

Page 2: Intro to Swift techitout

- Objective-C сложный для изучения

- Своеобразный синтаксис [[UIView alloc] initWithFrame:CGRectMake(30, 30, 200, 200)]

- ObjC устарел относительно современных языков (Rust, Ruby и т.д.)

Почему Swift

Page 3: Intro to Swift techitout

Что нового в Swift- Swift безопасней ObjC

- Generics

- Tuples

- Optionals

Page 4: Intro to Swift techitout

Определение переменных

var aString: String = "String variable"keyword name type initial value

let pi = 3.14159265359

Плюсы неизменяемых типов данных:- При инициализации уверены что объект не изменится- Оптимизированы относительно изменяемых типов- Безопасны при многопоточном программировании

Page 5: Intro to Swift techitout

Что нового со строками

NSString *baseUrlStr = @"http://vk.com/";NSString *str = [baseUrlStr stringByAppendingString:@"feed"];

let baseUrlStr = "http://vk.com/"let str = baseUrlStr + "feed"

ObjectiveC

Swift

Page 6: Intro to Swift techitout

Что нового со строкамиNSInteger a = 5;NSInteger b = 6;NSString *str = [NSString stringWithFormat:@"Если мы сложим %d c %d получим %d", a, b, a + b];

let a = 5let b = 6let str = "Если мы сложим \(a) c \(b) получим \(a + b)"

ObjectiveC

Swift

Page 7: Intro to Swift techitout

КоллекцииТеперь поддерживают простые типы данных

Array и Dictionary

let numAr = [123]

NSArray *numAr = @[[NSNumber numberWithInt:123]];

Swift

ObjC

Page 8: Intro to Swift techitout

КоллекцииArray

Dictionary

let names = ["Jordan", "Jansyn", "Bennett"]

let namesAndAges = ["Jordan":25, "Jansyn":25, "Bennett": 1]

Page 9: Intro to Swift techitout

Array

var modify = [“Jordan”]modify.appened(“Jansyn”)//["Jordan","Jansyn"]

var modify = ["Jordan"]modify[0] = "Jansyn"//["Jansyn"]

var modify = ["Jordan","Jansyn"]modify[0...1] = ["Bennett","Whitney"]//["Bennett","Whitney"]

Page 10: Intro to Swift techitout

Dictionary

Добавление новых элементовvar fruits = ["Апельсин":25]fruits["Банан"] = 30

Изменение старыхmorganFam["Апельсин"] = 26

Page 11: Intro to Swift techitout

Коллекции

Коллекции из разных типов данных:var multiTyped: [AnyObject] = ["foo", 01, true, 44.5]

AnyObject аналог из ObjC id

Page 12: Intro to Swift techitout

Loopsvar i = 6var fac = 1

while i > 0 { fac *= i i -= 1}println(fac)

//Output: 720

Page 13: Intro to Swift techitout

Loops

for i in 0..<2{ println(i)}//Output: 0,1

Ranges

for i in 0...2{ println(i)}//Output: 0,1,2

Page 14: Intro to Swift techitout

LoopsSwift

let abc = "abc"

for char in abc{ println(char)}

ObjCNSString *myStrings = @"abc"; for (NSInteger charIdx=0; charIdx < myStrings.length; charIdx++){ NSLog(@"%C", [myStrings characterAtIndex:charIdx]);}

Page 15: Intro to Swift techitout

LoopsИспользуйте _ , если не важен результат

let base = 3let power = 10var answer = 1for _ in 1...power{ answer *= base}

Обход коллекцийlet morganFam = ["Jordan":25,"Jansyn":25,"Bennett":1]

//KVPs from dictionary come back as tuplesfor (name,age) in morganFam{ println("\(name) is \(age) years old.")}

Page 16: Intro to Swift techitout

LoopsПример for с условием

for var idx = 0; idx < MAX; idx++{ println("Index is \(idx)")}

Не обязательны скобкиИницилизация с var, а не с let

Page 17: Intro to Swift techitout

Условия IfНе обязательны скобки над условиемФигурные скобки обязательны всегда

if 1 < 2 { println("True")} else { println("False")}

Page 18: Intro to Swift techitout

Switch Statements

Нет неявного проваливания в следующие условия

Fallthrough

Для выхода из switch используйте break

Для прокаливания в следующее условие используйте fallthrough

Не нужны фигурные скобки {}

Page 19: Intro to Swift techitout

Switch StatementsYou can get cute with them

Switches cont.

let anInt = 40switch anInt{case 0, 1, 2: println("Tiny")case 3...5: println("Medium")case 6..<39: println("Large")case _ where anInt % 2 == 1: println("It's odd")case _ where anInt % 2 == 0: println("Nope, it's not odd, it's even")default: break}

Page 20: Intro to Swift techitout

Switch StatementsThe old days

NSString *morganFamMember = @"Jordan"; if ([morganFamMember isEqualToString:@"Jansyn"]) { NSLog(@"It's mom!"); } else if([morganFamMember isEqualToString:@"Bennett"]) { NSLog(@"It's the baby boy!"); } else if([morganFamMember isEqualToString:@"Whit"]) { NSLog(@"It's Jordan's sister!"); } else if([morganFamMember isEqualToString:@"Jordan"]) { NSLog(@"It's dad!"); } else { NSLog(@"We don't know who it is."); }

The new dayslet morganFamMember = "Jordan"

switch morganFamMember{ case "Jansyn": println("It's mom!”) case "Bennett": println("It's the baby boy!") case "Whit": println("It's Jordan's sister!") case "Jordan": println("It's dad!") default: println("We don't know who it is.")}

Objective-C не поддерживает Switch с NSString

Page 21: Intro to Swift techitout

Tupleslet point:(Double, Double) = (4.00, 25.19)

let point2 = (4.00, 25.19)println(point.0)

let point3 = (x: 2, y: 5)println(point3.x)

Page 22: Intro to Swift techitout

Switch and Tupleslet 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")}

Page 23: Intro to Swift techitout

OptionalsA core concept of Swift

let dic = ["Sister" : 25]let years: Int = dic["Brother"]println(years)

А что если нет значения?

Page 24: Intro to Swift techitout

OptionalsA core concept of Swift

let dic = ["Sister" : 25]let years: Int? = dic["Brother"]println(years)

Optional- это обертка над обьектом.Some(obj).None

Page 25: Intro to Swift techitout

OptionalsКак достать объект из Optional:

Unwrapping

let jansynsAge:Int? = morganFam["Jansyn"]

if jansynsAge == nil{ println("Jansyn is apparently timeless.")}else{ let foundAge = jansynsAge! println("Jansyn is \(foundAge) years old.")}

Если мы уверены что там есть объект, достаем через !

Page 26: Intro to Swift techitout

OptionalsЕсли мы не уверены есть ли там обьект, достаем через if:

Short syntax

if let foundAge = jansynsAge{ println("Jansyn is \(foundAge) years old.")}else{ println("Jansyn is apparently timeless.")}

Page 27: Intro to Swift techitout

Optional ChainingКак безопасно достать параметр из объекта, который может быть пустым?

Query multiple optionals

class Photo { var url: String?}

class Person { var photo: Photo?}

var aPerson = Person()

Page 28: Intro to Swift techitout

Optional ChainingCont.

class Photo { var url: String?}

class Person { var photo: Photo?}

var aPerson = Person()

if let photoUrl = aPerson.photo?.url{ println("The photo url is \(photoUrl)")}else{ println("Person has no photo")}

Page 29: Intro to Swift techitout

FunctionsOverview

func printName(){ println("It's Jordan")}

Пример с параметрамиfunc printName(name:String){ println("It's \(name)”)}

Page 30: Intro to Swift techitout

FunctionsВозвращаемый результат функции определяем после ->

Return types

func printNameWithGreeting(name:String) -> String{ return "It's \(name), how ya doin' today?"}

Значения по умолчаниюfunc printNameWithGreeting(name:String = "Jansyn") -> String{ return "It's \(name), how ya doin' today?"}

Page 31: Intro to Swift techitout

FunctionsПример с Tuples

Multiple return types

func nameAndAge() -> (String, Int){ return ("Jordan",25)}

let (name,age) = nameAndAge()

println("\(name) is \(age) years old.")

Page 32: Intro to Swift techitout

FunctionsНазвания для возвращаемых значений

Name multiple return values

func nameAndAge() -> (name:String, age:Int){ return ("Jordan",25)}

let Jordan = nameAndAge()

println("\(Jordan.name) is \(Jordan.age) years old.")//Jordan is 25 years old.

Page 33: Intro to Swift techitout

Closures (Lambda)

Замена блокам из ObjC

Similar functionality

let aClosure ={ println("This is a closure")}

С объявлением типа:let aClosure: () -> () ={ println("This is a closure")}

Page 34: Intro to Swift techitout

ClosuresПередача Closure через параметры

Passed as a parameter

func doTaskRepeated(count: Int, theTask: () -> ()){ for i in 0..<count { theTask() }}

doTaskRepeated(10, { println("A complex and awesome task.")})

Page 35: Intro to Swift techitout

ClassesMuch like Java and .NET

Не обязательно явно определять класс родитель

class Person{ }

Page 36: Intro to Swift techitout

Classesclass Jordan{ let name = "Jordan"}

Properties

Можем задать значения по умолчанию

По умолчанию Internal доступ к параметрамclass Jordan{ let name = "Jordan" private let movieMostWatchedPastMonth = "Frozen"}

private, internal, public

Page 37: Intro to Swift techitout

ClassesCustom getters and setters

Computed properties

class Jordan{ let name = "Jordan"

var myLocation:(x:Float,y:Float) { get { return (10,30) } set { self.myLocation.x = newValue.x self.myLocation.y = newValue.y } }}

Page 38: Intro to Swift techitout

ClassesReadonlyComputed properties

class MyClass { var str: String = "123" var readonlyStr: String { return "123" }}

Page 39: Intro to Swift techitout

Classesinit() keywordInitialization

class Jordan{ let name = "Jordan" var age = 25 init() { //No need to return self }}

Можем инициализировать константыclass Jordan{ let name = "Jordan" let hobby = "" init() { //No need to return self } init(hobby:String) { self.hobby = hobby }}

var aJordan = Jordan(hobby: "Basketball")

- при наследовании вызывайте super.init()

Page 40: Intro to Swift techitout

ClassesМожем наблюдать за изменением property

Property Observers

class Bennett{ private let setCurfew = 9 //p.m. var curfew : Int { willSet { if curfew > setCurfew { println("GROUNDED") } } didSet { if curfew < setCurfew { println("I am glad you obey.") } } } init() { self.curfew = setCurfew }}

Page 41: Intro to Swift techitout

Structs

Структуры имеют все тоже самое что и классы, кроме:

Not much has changed

- Не поддерживают наследование- Value types

Page 42: Intro to Swift techitout

Enumerations

Value types

Enums

enum BestNFLTeams:Int{ case StLouisRams = 1, Patriots, Bucs, Chiefs}

enum ResponceData { case Success(AnyObject) case Error(String)}

Page 43: Intro to Swift techitout

Разработка под iOS

MVC

Page 44: Intro to Swift techitout
Page 45: Intro to Swift techitout

Resources- http://www.raywenderlich.com/

- The Swift Programming Language (iBook)

- The Swift Blog

- WWDC Videos