swift school #1
DESCRIPTION
Swift School #1TRANSCRIPT
Swift Школа
Сергей Пронин Empatika
План
• Интро
• Why Swift?
• Как подружить Objective-C и Swift?
ИнтроСергей Пронин
Ведущий разработчик Empatika Ведущий разработчик App in the Air Преподаватель НИУ-ВШЭ @spronin [email protected]
Why Swift?• Multiple return values
• Optionals -> Safety
• Playgrounds
• Extensions
• Powerful enums
• Sweet syntax
var variable: Double = 55 variable = 12 let constant = 42 //implicit Int
let str = "Answer is \(constant)"
var ar: [Int] = [1, 2, 3] var dic: [String: AnyObject] = ["key": "value", "num": 123]
for n in ar { if n % 2 == 0 { println(n) } }
for (key, value) in dic { println("\(key) -> \(value)") }
var optional: String? = "Hello?"
if let exists = optional { println(exists) }
if optional != nil { println(optional!) }
if optional?.hasSuffix("?") { println("somebody home?") }
let lang = "swift" switch (lang) { case "swift": println("young") case let x where x.hasSuffix("#"): println("wat?") case "js", "css": println("web") default: println("java, is it you?") }
//add <break> to exit clause //add <fallthrough> to fall through
for i in 0..<ar.count { //0...n = [0,n] println(ar[i]) }
for var i = 0; i < ar.count; i++ { println(ar[i]) }
do { fetchMessagesFromServer() sleep(5) } while true
while ar.count > 0 { ar.removeLast() }
func confession(name: String) -> String { return "I miss \(name)" }
confession("my mom")
func fl(a: [AnyObject]) -> (first: AnyObject, last: AnyObject) { return (a[0], a[a.count-1]) }
var result = fl(ar) println(result.first) println(result.1)
func params(numbers: Int…) -> Int { var sum = 0 for n in numbers { sum += n } return sum }
params(1, 1, 2, 3, 5, 8)
func isEven(n: Int) -> Bool { return n % 2 == 0 }
func filter(a: [Int], check: Int -> Bool) -> [Int] { var result: [Int] = [] for n in a { if check(n) { result.append(n) } } return result }
filter(0...10, isEven)
filter(0...10, { (item: Int) -> Bool in return item % 2 == 0 })
filter(0...100, { item in item % 10 == 0 })
filter(0...100, { $0 % 10 == 0 })
filter(0...100) { $0 % 10 == 0 }
class Shape { var sides = 0 var name: String
init(name: String) { self.name = name }
func description() -> String { return "Sides -> \(sides)" } }
var shape = Shape(name: "ama shape") shape.description()
class Triangle: Shape { var a, b, c: Int init(name: String, sides a: Int, _ b: Int, _ c: Int) { self.a = a self.b = b self.c = c super.init(name: name) self.sides = 3 } var perimeter: Int { get { return a + b + c } } override func description() -> String { return "Triangle with perimeter -> \(perimeter)" } }
var tr = Triangle(name: "Tr", sides: 5, 10, 20) tr.description
extension Shape {
class func plusFunction() -> String { return "I’m a class function " }
}
Shape.plusFunction()
struct StructShape { //all the same code, actually static func plusFunction() -> String { return "Passed by value" } } //struct objects are being passed by value //class objects are being passed by reference
enum Status: Int { case Undetermined, Success, Failure }
func sendRequest() -> Status { //networking magic return Status.Success }
var result = sendRequest() switch result { case .Success: println("success") case .Failure: println("failure") case .Undetermined: println("n/a") } result = Status.fromRaw(1)! //Success result.toRaw() //1
protocol NetworkingDelegate { func request(request: NSURLRequest, completedWithResult result: NSData?) }
class ServerHelper { var delegate: NetworkingDelegate? func doRequest(request: NSURLRequest) { var data = NSData(contentsOfURL: request.URL) delegate?.request(request, completedWithResult: data) } }
class Controller: NetworkingDelegate { func request(request: NSURLRequest, completedWithResult result: NSData?) { println("magic") }
let helper = ServerHelper() helper.delegate = Controller() let url = NSURL(string: "http://empatika.com") helper.doRequest(NSURLRequest(URL: url)))
Objective-C + Swift
Готовимся
typedef enum { StatusSuccess, StatusFailure } Status
typedef NS_ENUM(NSInteger, Status) { StatusSuccess, StatusFailure };
+ (id)sharedInstance { //your singleton magic }
+ (instancetype)sharedInstance { //singleton magic }
- (instancetype)init { //initial magic }
• В существующей Objective-C codebase -> New File - Cocoa Touch Class -> Swift ->Configure Header
• В созданный Bridging Header импортируем все, что Swift должен видеть из Obj-C#import “MyAFAPIClient.h”
• Чтобы Obj-C видел из Swift импортируем#import “ProductModuleName-Swift.h”
• Открыть Swift-классы и протоколы через @objc@objc(Venue)class Venue {…}
Перегнать модель или Controller на Swift
Начать новый проект на Swift с модели или
Controller-а