SlideShare a Scribd company logo
Введение в Swift
- Objective-C сложный для изучения
- Своеобразный синтаксис
[[UIView alloc] initWithFrame:CGRectMake(30, 30, 200, 200)]
- ObjC устарел относительно современных языков (Rust,
Ruby и т.д.)
Почему Swift
Что нового в Swift
- Swift безопасней ObjC
- Generics
- Tuples
- Optionals
Определение
переменных
var aString: String = "String variable"
keyword name type initial value
let pi = 3.14159265359
Плюсы неизменяемых типов данных:
- При инициализации уверены что объект не изменится
- Оптимизированы относительно изменяемых типов
- Безопасны при многопоточном программировании
Что нового со строками
NSString *baseUrlStr = @"http://vk.com/";
NSString *str = [baseUrlStr stringByAppendingString:@"feed"];
let baseUrlStr = "http://vk.com/"
let str = baseUrlStr + "feed"
ObjectiveC
Swift
Что нового со строками
NSInteger a = 5;
NSInteger b = 6;
NSString *str = [NSString stringWithFormat:@"Если мы сложим %d c %d
получим %d", a, b, a + b];
let a = 5
let b = 6
let str = "Если мы сложим (a) c (b) получим (a + b)"
ObjectiveC
Swift
Коллекции
Теперь поддерживают простые типы данных
Array и Dictionary
let numAr = [123]
NSArray *numAr = @[[NSNumber numberWithInt:123]];
Swift
ObjC
Коллекции
Array
Dictionary
let names = ["Jordan", "Jansyn", "Bennett"]
let namesAndAges = ["Jordan":25, "Jansyn":25, "Bennett": 1]
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"]
Dictionary
Добавление новых элементов
var fruits = ["Апельсин":25]
fruits["Банан"] = 30
Изменение старых
morganFam["Апельсин"] = 26
Коллекции
Коллекции из разных типов данных:
var multiTyped: [AnyObject] = ["foo", 01, true, 44.5]
AnyObject аналог из ObjC id
Loops
var i = 6
var fac = 1
while i > 0 {
fac *= i
i -= 1
}
println(fac)
//Output: 720
Loops
for i in 0..<2
{
println(i)
}
//Output: 0,1
Ranges
for i in 0...2
{
println(i)
}
//Output: 0,1,2
Loops
Swift
let abc = "abc"
for char in abc
{
println(char)
}
ObjC
NSString *myStrings = @"abc";
for (NSInteger charIdx=0; charIdx < myStrings.length; charIdx++)
{
NSLog(@"%C", [myStrings characterAtIndex:charIdx]);
}
Loops
Используйте _ , если не важен результат
let base = 3
let power = 10
var answer = 1
for _ in 1...power
{
answer *= base
}
Обход коллекций
let morganFam = ["Jordan":25,"Jansyn":25,"Bennett":1]
//KVPs from dictionary come back as tuples
for (name,age) in morganFam
{
println("(name) is (age) years old.")
}
Loops
Пример for с условием
for var idx = 0; idx < MAX; idx++
{
println("Index is (idx)")
}
Не обязательны скобки
Иницилизация с var, а не с let
Условия If
Не обязательны скобки над условием
Фигурные скобки обязательны всегда
if 1 < 2 {
println("True")
} else {
println("False")
}
Switch Statements
Нет неявного проваливания в следующие условия
Fallthrough
Для выхода из switch используйте break
Для прокаливания в следующее условие используйте fa
Не нужны фигурные скобки {}
Switch Statements
You can get cute with them
Switches cont.
let anInt = 40
switch 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
}
Switch Statements
The 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 days
let 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
Tuples
let 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)
Switch and Tuples
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")
}
Optionals
A core concept of Swift
let dic = ["Sister" : 25]
let years: Int = dic["Brother"]
println(years)
А что если нет значения?
Optionals
A core concept of Swift
let dic = ["Sister" : 25]
let years: Int? = dic["Brother"]
println(years)
Optional- это обертка над обьектом
.Some(obj)
.None
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.")
}
Если мы уверены что там есть объект, достаем через !
Optionals
Если мы не уверены есть ли там обьект, достаем через if:
Short syntax
if let foundAge = jansynsAge
{
println("Jansyn is (foundAge) years old.")
}
else
{
println("Jansyn is apparently timeless.")
}
Optional Chaining
Как безопасно достать параметр из объекта, который
может быть пустым?
Query multiple optionals
class Photo {
var url: String?
}
class Person {
var photo: Photo?
}
var aPerson = Person()
Optional Chaining
Cont.
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")
}
Functions
Overview
func printName()
{
println("It's Jordan")
}
Пример с параметрами
func printName(name:String)
{
println("It's (name)”)
}
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?"
}
Functions
Пример с Tuples
Multiple return types
func nameAndAge() -> (String, Int)
{
return ("Jordan",25)
}
let (name,age) = nameAndAge()
println("(name) is (age) years old.")
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.
Closures (Lambda)
Замена блокам из ObjC
Similar functionality
let aClosure =
{
println("This is a closure")
}
С объявлением типа:
let aClosure: () -> () =
{
println("This is a closure")
}
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.")
})
Classes
Much like Java and .NET
Не обязательно явно определять класс родитель
class Person
{
}
Classes
class Jordan
{
let name = "Jordan"
}
Properties
Можем задать значения по умолчанию
По умолчанию Internal доступ к параметрам
class Jordan
{
let name = "Jordan"
private let movieMostWatchedPastMonth = "Frozen"
}
private, internal, public
Classes
Custom 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
}
}
}
Classes
Readonly
Computed properties
class MyClass {
var str: String = "123"
var readonlyStr: String {
return "123"
}
}
Classes
init() keyword
Initialization
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()
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
}
}
Structs
Структуры имеют все тоже самое что и классы, кроме:
Not much has changed
- Не поддерживают наследование
- Value types
Enumerations
Value types
Enums
enum BestNFLTeams:Int
{
case StLouisRams = 1, Patriots, Bucs, Chiefs
}
enum ResponceData {
case Success(AnyObject)
case Error(String)
}
Разработка под iOS
MVC
Resources
- http://www.raywenderlich.com/
- The Swift Programming Language (iBook)
- The Swift Blog
- WWDC Videos

More Related Content

What's hot

Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгирование
Python Meetup
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
MoscowDjango
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Python Meetup
 
Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.by
Python Meetup
 
Developing highload servers with Java
Developing highload servers with JavaDeveloping highload servers with Java
Developing highload servers with Java
Andrei Pangin
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному коду
Vasiliy Deynega
 
Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11
Yandex
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Mikhail Matrosov
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Sergey Platonov
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка Django
Vladimir Rudnyh
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_cast
Roman Orlov
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Mail.ru Group
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибок
Andrey Karpov
 
Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.
Roman Brovko
 

What's hot (19)

Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгирование
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
 
Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.by
 
Developing highload servers with Java
Developing highload servers with JavaDeveloping highload servers with Java
Developing highload servers with Java
 
Bytecode
BytecodeBytecode
Bytecode
 
JRebel
JRebelJRebel
JRebel
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному коду
 
Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка Django
 
Zagursky
ZagurskyZagursky
Zagursky
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_cast
 
course js day 2
course js day 2course js day 2
course js day 2
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибок
 
C sharp deep dive
C sharp deep diveC sharp deep dive
C sharp deep dive
 
Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.
 

Viewers also liked

c.v Ali abu gookh 2
c.v Ali abu gookh 2c.v Ali abu gookh 2
c.v Ali abu gookh 2Ali Abujoukh
 
стратегія харкова га
стратегія харкова гастратегія харкова га
стратегія харкова га
GenderCentre
 
Development Programme 2008
Development Programme 2008Development Programme 2008
Development Programme 2008
Sunny Pawar
 
НАЦІОНАЛЬНЕ ЗАКОНОДАВСТВО У СФЕРІ ЗАБЕЗПЕЧЕННЯ РІВНИХ ПРАВ ТА МОЖЛИВОСТЕЙ ЖІН...
НАЦІОНАЛЬНЕ ЗАКОНОДАВСТВО У СФЕРІ ЗАБЕЗПЕЧЕННЯ РІВНИХ ПРАВ ТА МОЖЛИВОСТЕЙ ЖІН...НАЦІОНАЛЬНЕ ЗАКОНОДАВСТВО У СФЕРІ ЗАБЕЗПЕЧЕННЯ РІВНИХ ПРАВ ТА МОЖЛИВОСТЕЙ ЖІН...
НАЦІОНАЛЬНЕ ЗАКОНОДАВСТВО У СФЕРІ ЗАБЕЗПЕЧЕННЯ РІВНИХ ПРАВ ТА МОЖЛИВОСТЕЙ ЖІН...
GenderCentre
 
ВИДАТНІ ЖІНКИ В НАУЦІ
ВИДАТНІ ЖІНКИ В НАУЦІВИДАТНІ ЖІНКИ В НАУЦІ
ВИДАТНІ ЖІНКИ В НАУЦІ
GenderCentre
 
Building BI Project
Building BI ProjectBuilding BI Project
Building BI Project
Pooja Prabhu
 
Resume
ResumeResume
Resume
manoj sahu
 

Viewers also liked (7)

c.v Ali abu gookh 2
c.v Ali abu gookh 2c.v Ali abu gookh 2
c.v Ali abu gookh 2
 
стратегія харкова га
стратегія харкова гастратегія харкова га
стратегія харкова га
 
Development Programme 2008
Development Programme 2008Development Programme 2008
Development Programme 2008
 
НАЦІОНАЛЬНЕ ЗАКОНОДАВСТВО У СФЕРІ ЗАБЕЗПЕЧЕННЯ РІВНИХ ПРАВ ТА МОЖЛИВОСТЕЙ ЖІН...
НАЦІОНАЛЬНЕ ЗАКОНОДАВСТВО У СФЕРІ ЗАБЕЗПЕЧЕННЯ РІВНИХ ПРАВ ТА МОЖЛИВОСТЕЙ ЖІН...НАЦІОНАЛЬНЕ ЗАКОНОДАВСТВО У СФЕРІ ЗАБЕЗПЕЧЕННЯ РІВНИХ ПРАВ ТА МОЖЛИВОСТЕЙ ЖІН...
НАЦІОНАЛЬНЕ ЗАКОНОДАВСТВО У СФЕРІ ЗАБЕЗПЕЧЕННЯ РІВНИХ ПРАВ ТА МОЖЛИВОСТЕЙ ЖІН...
 
ВИДАТНІ ЖІНКИ В НАУЦІ
ВИДАТНІ ЖІНКИ В НАУЦІВИДАТНІ ЖІНКИ В НАУЦІ
ВИДАТНІ ЖІНКИ В НАУЦІ
 
Building BI Project
Building BI ProjectBuilding BI Project
Building BI Project
 
Resume
ResumeResume
Resume
 

Similar to Intro to Swift techitout

Scala for android
Scala for androidScala for android
Scala for android
Alexander Rusin
 
Mera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-CMera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-C
Sergey Pronin
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
Vasil Remeniuk
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
Pavel Tsukanov
 
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидах
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидахCodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидах
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидахCodeFest
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3
Technopark
 
Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур
 Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур  Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур
Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур
it-people
 
Java 8 puzzlers
Java 8 puzzlersJava 8 puzzlers
Java 8 puzzlers
Evgeny Borisov
 
msumobi2. Лекция 1
msumobi2. Лекция 1msumobi2. Лекция 1
msumobi2. Лекция 1
Глеб Тарасов
 
Kotlin на практике
Kotlin на практикеKotlin на практике
Kotlin на практике
Виталий Бендик
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
Andrey Karpov
 
Kotlin
KotlinKotlin
Kotlin
GDG Odessa
 
Статический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутСтатический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минут
Andrey Karpov
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
Andrey Karpov
 
Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кода
Andrey Karpov
 
AlgoCollections (RUS)
AlgoCollections (RUS)AlgoCollections (RUS)
AlgoCollections (RUS)
Anton Bukov
 
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CГлеб Тарасов
 
Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!
RAMBLER&Co
 
Scala on android
Scala on androidScala on android
Scala on android
Valeriya Atamanova
 

Similar to Intro to Swift techitout (20)

Scala for android
Scala for androidScala for android
Scala for android
 
Mera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-CMera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-C
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидах
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидахCodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидах
CodeFest 2014. Пугачев С. — Язык TypeScript или JavaScript на стероидах
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3
 
Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур
 Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур  Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур
Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур
 
Java 8 puzzlers
Java 8 puzzlersJava 8 puzzlers
Java 8 puzzlers
 
msumobi2. Лекция 1
msumobi2. Лекция 1msumobi2. Лекция 1
msumobi2. Лекция 1
 
Kotlin на практике
Kotlin на практикеKotlin на практике
Kotlin на практике
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
Kotlin
KotlinKotlin
Kotlin
 
Статический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутСтатический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минут
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кода
 
AlgoCollections (RUS)
AlgoCollections (RUS)AlgoCollections (RUS)
AlgoCollections (RUS)
 
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
 
Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!
 
Scala on android
Scala on androidScala on android
Scala on android
 

Intro to Swift techitout

  • 2. - Objective-C сложный для изучения - Своеобразный синтаксис [[UIView alloc] initWithFrame:CGRectMake(30, 30, 200, 200)] - ObjC устарел относительно современных языков (Rust, Ruby и т.д.) Почему Swift
  • 3. Что нового в Swift - Swift безопасней ObjC - Generics - Tuples - Optionals
  • 4. Определение переменных var aString: String = "String variable" keyword name type initial value let pi = 3.14159265359 Плюсы неизменяемых типов данных: - При инициализации уверены что объект не изменится - Оптимизированы относительно изменяемых типов - Безопасны при многопоточном программировании
  • 5. Что нового со строками NSString *baseUrlStr = @"http://vk.com/"; NSString *str = [baseUrlStr stringByAppendingString:@"feed"]; let baseUrlStr = "http://vk.com/" let str = baseUrlStr + "feed" ObjectiveC Swift
  • 6. Что нового со строками NSInteger a = 5; NSInteger b = 6; NSString *str = [NSString stringWithFormat:@"Если мы сложим %d c %d получим %d", a, b, a + b]; let a = 5 let b = 6 let str = "Если мы сложим (a) c (b) получим (a + b)" ObjectiveC Swift
  • 7. Коллекции Теперь поддерживают простые типы данных Array и Dictionary let numAr = [123] NSArray *numAr = @[[NSNumber numberWithInt:123]]; Swift ObjC
  • 8. Коллекции Array Dictionary let names = ["Jordan", "Jansyn", "Bennett"] let namesAndAges = ["Jordan":25, "Jansyn":25, "Bennett": 1]
  • 9. 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"]
  • 10. Dictionary Добавление новых элементов var fruits = ["Апельсин":25] fruits["Банан"] = 30 Изменение старых morganFam["Апельсин"] = 26
  • 11. Коллекции Коллекции из разных типов данных: var multiTyped: [AnyObject] = ["foo", 01, true, 44.5] AnyObject аналог из ObjC id
  • 12. Loops var i = 6 var fac = 1 while i > 0 { fac *= i i -= 1 } println(fac) //Output: 720
  • 13. Loops for i in 0..<2 { println(i) } //Output: 0,1 Ranges for i in 0...2 { println(i) } //Output: 0,1,2
  • 14. Loops Swift let abc = "abc" for char in abc { println(char) } ObjC NSString *myStrings = @"abc"; for (NSInteger charIdx=0; charIdx < myStrings.length; charIdx++) { NSLog(@"%C", [myStrings characterAtIndex:charIdx]); }
  • 15. Loops Используйте _ , если не важен результат let base = 3 let power = 10 var answer = 1 for _ in 1...power { answer *= base } Обход коллекций let morganFam = ["Jordan":25,"Jansyn":25,"Bennett":1] //KVPs from dictionary come back as tuples for (name,age) in morganFam { println("(name) is (age) years old.") }
  • 16. Loops Пример for с условием for var idx = 0; idx < MAX; idx++ { println("Index is (idx)") } Не обязательны скобки Иницилизация с var, а не с let
  • 17. Условия If Не обязательны скобки над условием Фигурные скобки обязательны всегда if 1 < 2 { println("True") } else { println("False") }
  • 18. Switch Statements Нет неявного проваливания в следующие условия Fallthrough Для выхода из switch используйте break Для прокаливания в следующее условие используйте fa Не нужны фигурные скобки {}
  • 19. Switch Statements You can get cute with them Switches cont. let anInt = 40 switch 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 }
  • 20. Switch Statements The 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 days let 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
  • 21. Tuples let 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)
  • 22. Switch and Tuples 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") }
  • 23. Optionals A core concept of Swift let dic = ["Sister" : 25] let years: Int = dic["Brother"] println(years) А что если нет значения?
  • 24. Optionals A core concept of Swift let dic = ["Sister" : 25] let years: Int? = dic["Brother"] println(years) Optional- это обертка над обьектом .Some(obj) .None
  • 25. 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.") } Если мы уверены что там есть объект, достаем через !
  • 26. Optionals Если мы не уверены есть ли там обьект, достаем через if: Short syntax if let foundAge = jansynsAge { println("Jansyn is (foundAge) years old.") } else { println("Jansyn is apparently timeless.") }
  • 27. Optional Chaining Как безопасно достать параметр из объекта, который может быть пустым? Query multiple optionals class Photo { var url: String? } class Person { var photo: Photo? } var aPerson = Person()
  • 28. Optional Chaining Cont. 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") }
  • 29. Functions Overview func printName() { println("It's Jordan") } Пример с параметрами func printName(name:String) { println("It's (name)”) }
  • 30. 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?" }
  • 31. Functions Пример с Tuples Multiple return types func nameAndAge() -> (String, Int) { return ("Jordan",25) } let (name,age) = nameAndAge() println("(name) is (age) years old.")
  • 32. 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.
  • 33. Closures (Lambda) Замена блокам из ObjC Similar functionality let aClosure = { println("This is a closure") } С объявлением типа: let aClosure: () -> () = { println("This is a closure") }
  • 34. 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.") })
  • 35. Classes Much like Java and .NET Не обязательно явно определять класс родитель class Person { }
  • 36. Classes class Jordan { let name = "Jordan" } Properties Можем задать значения по умолчанию По умолчанию Internal доступ к параметрам class Jordan { let name = "Jordan" private let movieMostWatchedPastMonth = "Frozen" } private, internal, public
  • 37. Classes Custom 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 } } }
  • 38. Classes Readonly Computed properties class MyClass { var str: String = "123" var readonlyStr: String { return "123" } }
  • 39. Classes init() keyword Initialization 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()
  • 40. 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 } }
  • 41. Structs Структуры имеют все тоже самое что и классы, кроме: Not much has changed - Не поддерживают наследование - Value types
  • 42. Enumerations Value types Enums enum BestNFLTeams:Int { case StLouisRams = 1, Patriots, Bucs, Chiefs } enum ResponceData { case Success(AnyObject) case Error(String) }
  • 44.
  • 45. Resources - http://www.raywenderlich.com/ - The Swift Programming Language (iBook) - The Swift Blog - WWDC Videos