Upload
alexandr-graschenkov
View
89
Download
0
Embed Size (px)
Citation preview
Введение в 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 = 5let b = 6let 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
Loopsvar i = 6var 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
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]);}
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.")}
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
Для прокаливания в следующее условие используйте fallthrough
Не нужны фигурные скобки {}
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}
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
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)
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")}
OptionalsA core concept of Swift
let dic = ["Sister" : 25]let years: Int = dic["Brother"]println(years)
А что если нет значения?
OptionalsA 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 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")}
FunctionsOverview
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.")})
ClassesMuch like Java and .NET
Не обязательно явно определять класс родитель
class Person{ }
Classesclass Jordan{ let name = "Jordan"}
Properties
Можем задать значения по умолчанию
По умолчанию Internal доступ к параметрамclass Jordan{ let name = "Jordan" private let movieMostWatchedPastMonth = "Frozen"}
private, internal, public
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 } }}
ClassesReadonlyComputed properties
class MyClass { var str: String = "123" var readonlyStr: String { return "123" }}
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()
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