Mera Dev Fest - Swift vs. Obj-C

205
Swift второе рождение Objective-C? Сергей Пронин Empatika НИУ-ВШЭ

description

Презентация с конференции Mera Dev Fest

Transcript of Mera Dev Fest - Swift vs. Obj-C

Page 1: Mera Dev Fest - Swift vs. Obj-C

Swiftвторое рождение

Objective-C?

Сергей Пронин Empatika НИУ-ВШЭ

Page 2: Mera Dev Fest - Swift vs. Obj-C

Сергей Пронин

Full-stack Developer Empatika

Senior Developer, Co-Founder App in the Air

ПреподавательНИУ-ВШЭ Департамент Программной Инженерии

Page 3: Mera Dev Fest - Swift vs. Obj-C
Page 4: Mera Dev Fest - Swift vs. Obj-C

WWDC 2014

Page 5: Mera Dev Fest - Swift vs. Obj-C
Page 6: Mera Dev Fest - Swift vs. Obj-C
Page 7: Mera Dev Fest - Swift vs. Obj-C

Первые мысли

• WAT?

• У меня были планы на лето

• Пора качать Xcode Beta

• Первый Playground

Page 8: Mera Dev Fest - Swift vs. Obj-C
Page 9: Mera Dev Fest - Swift vs. Obj-C
Page 10: Mera Dev Fest - Swift vs. Obj-C
Page 11: Mera Dev Fest - Swift vs. Obj-C

Apple Good to great

Page 12: Mera Dev Fest - Swift vs. Obj-C

Почему Swift сменит Objective-C

Page 13: Mera Dev Fest - Swift vs. Obj-C

Новый hardware

Page 14: Mera Dev Fest - Swift vs. Obj-C

Watch

WatchKit

Page 15: Mera Dev Fest - Swift vs. Obj-C
Page 16: Mera Dev Fest - Swift vs. Obj-C

Почему Swift?

Page 17: Mera Dev Fest - Swift vs. Obj-C

Почему Swift?• Возможность вернуть несколько значений из метода

Page 18: Mera Dev Fest - Swift vs. Obj-C

Почему Swift?• Возможность вернуть несколько значений из метода

• Optionals

Page 19: Mera Dev Fest - Swift vs. Obj-C

Почему Swift?• Возможность вернуть несколько значений из метода

• Optionals

• Защита от ошибок

Page 20: Mera Dev Fest - Swift vs. Obj-C

Почему Swift?• Возможность вернуть несколько значений из метода

• Optionals

• Защита от ошибок

• Playgrounds

Page 21: Mera Dev Fest - Swift vs. Obj-C

Почему Swift?• Возможность вернуть несколько значений из метода

• Optionals

• Защита от ошибок

• Playgrounds

• Полнофункциональные Enum

Page 22: Mera Dev Fest - Swift vs. Obj-C

Почему Swift?• Возможность вернуть несколько значений из метода

• Optionals

• Защита от ошибок

• Playgrounds

• Полнофункциональные Enum

• “Сладкий” синтаксис

Page 23: Mera Dev Fest - Swift vs. Obj-C

Защита от глупостей

Page 24: Mera Dev Fest - Swift vs. Obj-C
Page 25: Mera Dev Fest - Swift vs. Obj-C

let lang = "swift"

Page 26: Mera Dev Fest - Swift vs. Obj-C

let lang = "swift"switch (lang) {

Page 27: Mera Dev Fest - Swift vs. Obj-C

let lang = "swift"switch (lang) { case "swift":

Page 28: Mera Dev Fest - Swift vs. Obj-C

let lang = "swift"switch (lang) { case "swift": println("young")

Page 29: Mera Dev Fest - Swift vs. Obj-C

let lang = "swift"switch (lang) { case "swift": println("young") case let x where x.hasSuffix("#"):

Page 30: Mera Dev Fest - Swift vs. Obj-C

let lang = "swift"switch (lang) { case "swift": println("young") case let x where x.hasSuffix("#"): println("wat?")

Page 31: Mera Dev Fest - Swift vs. Obj-C

let lang = "swift"switch (lang) { case "swift": println("young") case let x where x.hasSuffix("#"): println("wat?") case "js", "css":

Page 32: Mera Dev Fest - Swift vs. Obj-C

let lang = "swift"switch (lang) { case "swift": println("young") case let x where x.hasSuffix("#"): println("wat?") case "js", "css": println("web")

Page 33: Mera Dev Fest - Swift vs. Obj-C

let lang = "swift"switch (lang) { case "swift": println("young") case let x where x.hasSuffix("#"): println("wat?") case "js", "css": println("web") default:

Page 34: Mera Dev Fest - Swift vs. Obj-C

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?")

Page 35: Mera Dev Fest - Swift vs. Obj-C

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?")}

Page 36: Mera Dev Fest - Swift vs. Obj-C

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?")}

Page 37: Mera Dev Fest - Swift vs. Obj-C

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?")}

//<break> чтобы прервать

Page 38: Mera Dev Fest - Swift vs. Obj-C

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?")}

//<break> чтобы прервать//<fallthrough> чтобы “провалиться”

Page 39: Mera Dev Fest - Swift vs. Obj-C
Page 40: Mera Dev Fest - Swift vs. Obj-C

var langsOpt = dict["langs"]? .componentsJoinedByString?(", ")

Page 41: Mera Dev Fest - Swift vs. Obj-C

var langsOpt = dict["langs"]? .componentsJoinedByString?(", ")

Page 42: Mera Dev Fest - Swift vs. Obj-C

var langsOpt = dict["langs"]? .componentsJoinedByString?(", ")

if let langs = langsOpt {

Page 43: Mera Dev Fest - Swift vs. Obj-C

var langsOpt = dict["langs"]? .componentsJoinedByString?(", ")

if let langs = langsOpt { println("langs=\(langs)")

Page 44: Mera Dev Fest - Swift vs. Obj-C

var langsOpt = dict["langs"]? .componentsJoinedByString?(", ")

if let langs = langsOpt { println("langs=\(langs)")}

Page 45: Mera Dev Fest - Swift vs. Obj-C

var langsOpt = dict["langs"]? .componentsJoinedByString?(", ")

if let langs = langsOpt { println("langs=\(langs)")}

Page 46: Mera Dev Fest - Swift vs. Obj-C

var langsOpt = dict["langs"]? .componentsJoinedByString?(", ")

if let langs = langsOpt { println("langs=\(langs)")}

Page 47: Mera Dev Fest - Swift vs. Obj-C

var langsOpt = dict["langs"]? .componentsJoinedByString?(", ")

if let langs = langsOpt { println("langs=\(langs)")}

NSArray *langsArr = dict[@"langs"];

Page 48: Mera Dev Fest - Swift vs. Obj-C

var langsOpt = dict["langs"]? .componentsJoinedByString?(", ")

if let langs = langsOpt { println("langs=\(langs)")}

NSArray *langsArr = dict[@"langs"];NSString *langs = nil;

Page 49: Mera Dev Fest - Swift vs. Obj-C

var langsOpt = dict["langs"]? .componentsJoinedByString?(", ")

if let langs = langsOpt { println("langs=\(langs)")}

NSArray *langsArr = dict[@"langs"];NSString *langs = nil;if ([langs isKindOfClass:[NSArray class]]) {

Page 50: Mera Dev Fest - Swift vs. Obj-C

var langsOpt = dict["langs"]? .componentsJoinedByString?(", ")

if let langs = langsOpt { println("langs=\(langs)")}

NSArray *langsArr = dict[@"langs"];NSString *langs = nil;if ([langs isKindOfClass:[NSArray class]]) { langs = [langsArr componentsSeparatedByString:@", "];

Page 51: Mera Dev Fest - Swift vs. Obj-C

var langsOpt = dict["langs"]? .componentsJoinedByString?(", ")

if let langs = langsOpt { println("langs=\(langs)")}

NSArray *langsArr = dict[@"langs"];NSString *langs = nil;if ([langs isKindOfClass:[NSArray class]]) { langs = [langsArr componentsSeparatedByString:@", "];}

Page 52: Mera Dev Fest - Swift vs. Obj-C

var langsOpt = dict["langs"]? .componentsJoinedByString?(", ")

if let langs = langsOpt { println("langs=\(langs)")}

NSArray *langsArr = dict[@"langs"];NSString *langs = nil;if ([langs isKindOfClass:[NSArray class]]) { langs = [langsArr componentsSeparatedByString:@", "];}if (langs) {

Page 53: Mera Dev Fest - Swift vs. Obj-C

var langsOpt = dict["langs"]? .componentsJoinedByString?(", ")

if let langs = langsOpt { println("langs=\(langs)")}

NSArray *langsArr = dict[@"langs"];NSString *langs = nil;if ([langs isKindOfClass:[NSArray class]]) { langs = [langsArr componentsSeparatedByString:@", "];}if (langs) { //…

Page 54: Mera Dev Fest - Swift vs. Obj-C

var langsOpt = dict["langs"]? .componentsJoinedByString?(", ")

if let langs = langsOpt { println("langs=\(langs)")}

NSArray *langsArr = dict[@"langs"];NSString *langs = nil;if ([langs isKindOfClass:[NSArray class]]) { langs = [langsArr componentsSeparatedByString:@", "];}if (langs) { //…}

Page 55: Mera Dev Fest - Swift vs. Obj-C

var langsOpt = dict["langs"]? .componentsJoinedByString?(", ")

if let langs = langsOpt { println("langs=\(langs)")}

NSArray *langsArr = dict[@"langs"];NSString *langs = nil;if ([langs isKindOfClass:[NSArray class]]) { langs = [langsArr componentsSeparatedByString:@", "];}if (langs) { //…}

Page 56: Mera Dev Fest - Swift vs. Obj-C

Инструменты языка• Отсутствие try-catch конструкций

• Все методы в протоколах - обязательные

• Наличие ключевого слова required

• Модификаторы доступа

• Обязательная инициализация динамических переменных в конструкторе

Page 57: Mera Dev Fest - Swift vs. Obj-C

“Сладкий” синтаксис

Page 58: Mera Dev Fest - Swift vs. Obj-C
Page 59: Mera Dev Fest - Swift vs. Obj-C

enum Status: Int {

Page 60: Mera Dev Fest - Swift vs. Obj-C

enum Status: Int { case Undetermined, Success, Failure

Page 61: Mera Dev Fest - Swift vs. Obj-C

enum Status: Int { case Undetermined, Success, Failure}

Page 62: Mera Dev Fest - Swift vs. Obj-C

enum Status: Int { case Undetermined, Success, Failure}

Page 63: Mera Dev Fest - Swift vs. Obj-C

enum Status: Int { case Undetermined, Success, Failure}

func sendRequest() -> Status {

Page 64: Mera Dev Fest - Swift vs. Obj-C

enum Status: Int { case Undetermined, Success, Failure}

func sendRequest() -> Status { //networking magic

Page 65: Mera Dev Fest - Swift vs. Obj-C

enum Status: Int { case Undetermined, Success, Failure}

func sendRequest() -> Status { //networking magic return Status.Success

Page 66: Mera Dev Fest - Swift vs. Obj-C

enum Status: Int { case Undetermined, Success, Failure}

func sendRequest() -> Status { //networking magic return Status.Success}

Page 67: Mera Dev Fest - Swift vs. Obj-C

enum Status: Int { case Undetermined, Success, Failure}

func sendRequest() -> Status { //networking magic return Status.Success}

Page 68: Mera Dev Fest - Swift vs. Obj-C

enum Status: Int { case Undetermined, Success, Failure}

func sendRequest() -> Status { //networking magic return Status.Success}

var result = sendRequest()

Page 69: Mera Dev Fest - Swift vs. Obj-C

enum Status: Int { case Undetermined, Success, Failure}

func sendRequest() -> Status { //networking magic return Status.Success}

var result = sendRequest()switch result {

Page 70: Mera Dev Fest - Swift vs. Obj-C

enum Status: Int { case Undetermined, Success, Failure}

func sendRequest() -> Status { //networking magic return Status.Success}

var result = sendRequest()switch result { case .Success:

Page 71: Mera Dev Fest - Swift vs. Obj-C

enum Status: Int { case Undetermined, Success, Failure}

func sendRequest() -> Status { //networking magic return Status.Success}

var result = sendRequest()switch result { case .Success: println("success")

Page 72: Mera Dev Fest - Swift vs. Obj-C

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:

Page 73: Mera Dev Fest - Swift vs. Obj-C

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")

Page 74: Mera Dev Fest - Swift vs. Obj-C

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:

Page 75: Mera Dev Fest - Swift vs. Obj-C

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")

Page 76: Mera Dev Fest - Swift vs. Obj-C

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")}

Page 77: Mera Dev Fest - Swift vs. Obj-C

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

Page 78: Mera Dev Fest - Swift vs. Obj-C

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)! //Successresult.toRaw() //1

Page 79: Mera Dev Fest - Swift vs. Obj-C
Page 80: Mera Dev Fest - Swift vs. Obj-C

func isEven(n: Int) -> Bool {

Page 81: Mera Dev Fest - Swift vs. Obj-C

func isEven(n: Int) -> Bool { return n % 2 == 0

Page 82: Mera Dev Fest - Swift vs. Obj-C

func isEven(n: Int) -> Bool { return n % 2 == 0}

Page 83: Mera Dev Fest - Swift vs. Obj-C

func isEven(n: Int) -> Bool { return n % 2 == 0}

Page 84: Mera Dev Fest - Swift vs. Obj-C

func isEven(n: Int) -> Bool { return n % 2 == 0}

func filter(a: [Int], check: Int -> Bool)

Page 85: Mera Dev Fest - Swift vs. Obj-C

func isEven(n: Int) -> Bool { return n % 2 == 0}

func filter(a: [Int], check: Int -> Bool) -> [Int] {

Page 86: Mera Dev Fest - Swift vs. Obj-C

func isEven(n: Int) -> Bool { return n % 2 == 0}

func filter(a: [Int], check: Int -> Bool) -> [Int] { var result: [Int] = []

Page 87: Mera Dev Fest - Swift vs. Obj-C

func isEven(n: Int) -> Bool { return n % 2 == 0}

func filter(a: [Int], check: Int -> Bool) -> [Int] { var result: [Int] = [] for n in a {

Page 88: Mera Dev Fest - Swift vs. Obj-C

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) {

Page 89: Mera Dev Fest - Swift vs. Obj-C

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)

Page 90: Mera Dev Fest - Swift vs. Obj-C

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) }

Page 91: Mera Dev Fest - Swift vs. Obj-C

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) } }

Page 92: Mera Dev Fest - Swift vs. Obj-C

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

Page 93: Mera Dev Fest - Swift vs. Obj-C

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}

Page 94: Mera Dev Fest - Swift vs. Obj-C

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}

Page 95: Mera Dev Fest - Swift vs. Obj-C

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)

Page 96: Mera Dev Fest - Swift vs. Obj-C
Page 97: Mera Dev Fest - Swift vs. Obj-C

filter(0..<10, { (item: Int) -> Bool in

Page 98: Mera Dev Fest - Swift vs. Obj-C

filter(0..<10, { (item: Int) -> Bool in return item % 2 == 0

Page 99: Mera Dev Fest - Swift vs. Obj-C

filter(0..<10, { (item: Int) -> Bool in return item % 2 == 0})

Page 100: Mera Dev Fest - Swift vs. Obj-C

filter(0..<10, { (item: Int) -> Bool in return item % 2 == 0})

Page 101: Mera Dev Fest - Swift vs. Obj-C

filter(0..<10, { (item: Int) -> Bool in return item % 2 == 0})

filter(0...100, { item in item % 10 == 0 })

Page 102: Mera Dev Fest - Swift vs. Obj-C

filter(0..<10, { (item: Int) -> Bool in return item % 2 == 0})

filter(0...100, { item in item % 10 == 0 })

Page 103: Mera Dev Fest - Swift vs. Obj-C

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 })

Page 104: Mera Dev Fest - Swift vs. Obj-C

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 })

Page 105: Mera Dev Fest - Swift vs. Obj-C

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 }

Page 106: Mera Dev Fest - Swift vs. Obj-C
Page 107: Mera Dev Fest - Swift vs. Obj-C

var globalLazy: String = {

Page 108: Mera Dev Fest - Swift vs. Obj-C

var globalLazy: String = { return "Hello, lazy boy"

Page 109: Mera Dev Fest - Swift vs. Obj-C

var globalLazy: String = { return "Hello, lazy boy"}()

Page 110: Mera Dev Fest - Swift vs. Obj-C

var globalLazy: String = { return "Hello, lazy boy"}()

Page 111: Mera Dev Fest - Swift vs. Obj-C

var globalLazy: String = { return "Hello, lazy boy"}()

class Sample {

Page 112: Mera Dev Fest - Swift vs. Obj-C

var globalLazy: String = { return "Hello, lazy boy"}()

class Sample { lazy var x: Int = CallMethod()

Page 113: Mera Dev Fest - Swift vs. Obj-C

var globalLazy: String = { return "Hello, lazy boy"}()

class Sample { lazy var x: Int = CallMethod()

Page 114: Mera Dev Fest - Swift vs. Obj-C

var globalLazy: String = { return "Hello, lazy boy"}()

class Sample { lazy var x: Int = CallMethod()

var propDidWill: String? {

Page 115: Mera Dev Fest - Swift vs. Obj-C

var globalLazy: String = { return "Hello, lazy boy"}()

class Sample { lazy var x: Int = CallMethod()

var propDidWill: String? { didSet {

Page 116: Mera Dev Fest - Swift vs. Obj-C

var globalLazy: String = { return "Hello, lazy boy"}()

class Sample { lazy var x: Int = CallMethod()

var propDidWill: String? { didSet { //tell everyone

Page 117: Mera Dev Fest - Swift vs. Obj-C

var globalLazy: String = { return "Hello, lazy boy"}()

class Sample { lazy var x: Int = CallMethod()

var propDidWill: String? { didSet { //tell everyone }

Page 118: Mera Dev Fest - Swift vs. Obj-C

var globalLazy: String = { return "Hello, lazy boy"}()

class Sample { lazy var x: Int = CallMethod()

var propDidWill: String? { didSet { //tell everyone } willSet {

Page 119: Mera Dev Fest - Swift vs. Obj-C

var globalLazy: String = { return "Hello, lazy boy"}()

class Sample { lazy var x: Int = CallMethod()

var propDidWill: String? { didSet { //tell everyone } willSet { println("gonna set \(newValue)")

Page 120: Mera Dev Fest - Swift vs. Obj-C

var globalLazy: String = { return "Hello, lazy boy"}()

class Sample { lazy var x: Int = CallMethod()

var propDidWill: String? { didSet { //tell everyone } willSet { println("gonna set \(newValue)") }

Page 121: Mera Dev Fest - Swift vs. Obj-C

var globalLazy: String = { return "Hello, lazy boy"}()

class Sample { lazy var x: Int = CallMethod()

var propDidWill: String? { didSet { //tell everyone } willSet { println("gonna set \(newValue)") } }

Page 122: Mera Dev Fest - Swift vs. Obj-C

var globalLazy: String = { return "Hello, lazy boy"}()

class Sample { lazy var x: Int = CallMethod()

var propDidWill: String? { didSet { //tell everyone } willSet { println("gonna set \(newValue)") } }

Page 123: Mera Dev Fest - Swift vs. Obj-C

var globalLazy: String = { return "Hello, lazy boy"}()

class Sample { lazy var x: Int = CallMethod()

var propDidWill: String? { didSet { //tell everyone } willSet { println("gonna set \(newValue)") } }

let defaults = NSUserDefaults.standardUserDefaults()

Page 124: Mera Dev Fest - Swift vs. Obj-C

var globalLazy: String = { return "Hello, lazy boy"}()

class Sample { lazy var x: Int = CallMethod()

var propDidWill: String? { didSet { //tell everyone } willSet { println("gonna set \(newValue)") } }

let defaults = NSUserDefaults.standardUserDefaults() var prop: String? {

Page 125: Mera Dev Fest - Swift vs. Obj-C

var globalLazy: String = { return "Hello, lazy boy"}()

class Sample { lazy var x: Int = CallMethod()

var propDidWill: String? { didSet { //tell everyone } willSet { println("gonna set \(newValue)") } }

let defaults = NSUserDefaults.standardUserDefaults() var prop: String? { get {

Page 126: Mera Dev Fest - Swift vs. Obj-C

var globalLazy: String = { return "Hello, lazy boy"}()

class Sample { lazy var x: Int = CallMethod()

var propDidWill: String? { didSet { //tell everyone } willSet { println("gonna set \(newValue)") } }

let defaults = NSUserDefaults.standardUserDefaults() var prop: String? { get { return defaults.objectForKey("myDef") as? String

Page 127: Mera Dev Fest - Swift vs. Obj-C

var globalLazy: String = { return "Hello, lazy boy"}()

class Sample { lazy var x: Int = CallMethod()

var propDidWill: String? { didSet { //tell everyone } willSet { println("gonna set \(newValue)") } }

let defaults = NSUserDefaults.standardUserDefaults() var prop: String? { get { return defaults.objectForKey("myDef") as? String }

Page 128: Mera Dev Fest - Swift vs. Obj-C

var globalLazy: String = { return "Hello, lazy boy"}()

class Sample { lazy var x: Int = CallMethod()

var propDidWill: String? { didSet { //tell everyone } willSet { println("gonna set \(newValue)") } }

let defaults = NSUserDefaults.standardUserDefaults() var prop: String? { get { return defaults.objectForKey("myDef") as? String } set {

Page 129: Mera Dev Fest - Swift vs. Obj-C

var globalLazy: String = { return "Hello, lazy boy"}()

class Sample { lazy var x: Int = CallMethod()

var propDidWill: String? { didSet { //tell everyone } willSet { println("gonna set \(newValue)") } }

let defaults = NSUserDefaults.standardUserDefaults() var prop: String? { get { return defaults.objectForKey("myDef") as? String } set { defaults.setObject(newValue, forKey: “myDef”)

Page 130: Mera Dev Fest - Swift vs. Obj-C

var globalLazy: String = { return "Hello, lazy boy"}()

class Sample { lazy var x: Int = CallMethod()

var propDidWill: String? { didSet { //tell everyone } willSet { println("gonna set \(newValue)") } }

let defaults = NSUserDefaults.standardUserDefaults() var prop: String? { get { return defaults.objectForKey("myDef") as? String } set { defaults.setObject(newValue, forKey: “myDef”) defaults.syncrhonize()

Page 131: Mera Dev Fest - Swift vs. Obj-C

var globalLazy: String = { return "Hello, lazy boy"}()

class Sample { lazy var x: Int = CallMethod()

var propDidWill: String? { didSet { //tell everyone } willSet { println("gonna set \(newValue)") } }

let defaults = NSUserDefaults.standardUserDefaults() var prop: String? { get { return defaults.objectForKey("myDef") as? String } set { defaults.setObject(newValue, forKey: “myDef”) defaults.syncrhonize() }

Page 132: Mera Dev Fest - Swift vs. Obj-C

var globalLazy: String = { return "Hello, lazy boy"}()

class Sample { lazy var x: Int = CallMethod()

var propDidWill: String? { didSet { //tell everyone } willSet { println("gonna set \(newValue)") } }

let defaults = NSUserDefaults.standardUserDefaults() var prop: String? { get { return defaults.objectForKey("myDef") as? String } set { defaults.setObject(newValue, forKey: “myDef”) defaults.syncrhonize() } }

Page 133: Mera Dev Fest - Swift vs. Obj-C

var globalLazy: String = { return "Hello, lazy boy"}()

class Sample { lazy var x: Int = CallMethod()

var propDidWill: String? { didSet { //tell everyone } willSet { println("gonna set \(newValue)") } }

let defaults = NSUserDefaults.standardUserDefaults() var prop: String? { get { return defaults.objectForKey("myDef") as? String } set { defaults.setObject(newValue, forKey: “myDef”) defaults.syncrhonize() } }}

Page 134: Mera Dev Fest - Swift vs. Obj-C
Page 135: Mera Dev Fest - Swift vs. Obj-C

func + (left: Vector2D, right: Vector2D) -> Vector2D {

Page 136: Mera Dev Fest - Swift vs. Obj-C

func + (left: Vector2D, right: Vector2D) -> Vector2D { return Vector2D(x: left.x + right.x, y: left.y + right.y)

Page 137: Mera Dev Fest - Swift vs. Obj-C

func + (left: Vector2D, right: Vector2D) -> Vector2D { return Vector2D(x: left.x + right.x, y: left.y + right.y)}

Page 138: Mera Dev Fest - Swift vs. Obj-C

func + (left: Vector2D, right: Vector2D) -> Vector2D { return Vector2D(x: left.x + right.x, y: left.y + right.y)}

Page 139: Mera Dev Fest - Swift vs. Obj-C

func + (left: Vector2D, right: Vector2D) -> Vector2D { return Vector2D(x: left.x + right.x, y: left.y + right.y)}

func += (inout left: Vector2D, right: Vector2D) {

Page 140: Mera Dev Fest - Swift vs. Obj-C

func + (left: Vector2D, right: Vector2D) -> Vector2D { return Vector2D(x: left.x + right.x, y: left.y + right.y)}

func += (inout left: Vector2D, right: Vector2D) { left = left + right

Page 141: Mera Dev Fest - Swift vs. Obj-C

func + (left: Vector2D, right: Vector2D) -> Vector2D { return Vector2D(x: left.x + right.x, y: left.y + right.y)}

func += (inout left: Vector2D, right: Vector2D) { left = left + right}

Page 142: Mera Dev Fest - Swift vs. Obj-C

func + (left: Vector2D, right: Vector2D) -> Vector2D { return Vector2D(x: left.x + right.x, y: left.y + right.y)}

func += (inout left: Vector2D, right: Vector2D) { left = left + right}

Page 143: Mera Dev Fest - Swift vs. Obj-C

func + (left: Vector2D, right: Vector2D) -> Vector2D { return Vector2D(x: left.x + right.x, y: left.y + right.y)}

func += (inout left: Vector2D, right: Vector2D) { left = left + right}

let vector = Vector2D(x: 1.0, y: 2.0) + Vector2D(x: 0.5, y: -1.0) // {x: 1.5, y: 1.0}

Page 144: Mera Dev Fest - Swift vs. Obj-C

func + (left: Vector2D, right: Vector2D) -> Vector2D { return Vector2D(x: left.x + right.x, y: left.y + right.y)}

func += (inout left: Vector2D, right: Vector2D) { left = left + right}

let vector = Vector2D(x: 1.0, y: 2.0) + Vector2D(x: 0.5, y: -1.0) // {x: 1.5, y: 1.0}

Page 145: Mera Dev Fest - Swift vs. Obj-C

func + (left: Vector2D, right: Vector2D) -> Vector2D { return Vector2D(x: left.x + right.x, y: left.y + right.y)}

func += (inout left: Vector2D, right: Vector2D) { left = left + right}

let vector = Vector2D(x: 1.0, y: 2.0) + Vector2D(x: 0.5, y: -1.0) // {x: 1.5, y: 1.0}

vector += Vector2D(x: 1.0, y: 2.0) // {x: 2.5, y: 3.0}

Page 146: Mera Dev Fest - Swift vs. Obj-C

func + (left: Vector2D, right: Vector2D) -> Vector2D { return Vector2D(x: left.x + right.x, y: left.y + right.y)}

func += (inout left: Vector2D, right: Vector2D) { left = left + right}

let vector = Vector2D(x: 1.0, y: 2.0) + Vector2D(x: 0.5, y: -1.0) // {x: 1.5, y: 1.0}

vector += Vector2D(x: 1.0, y: 2.0) // {x: 2.5, y: 3.0}

Page 147: Mera Dev Fest - Swift vs. Obj-C

func + (left: Vector2D, right: Vector2D) -> Vector2D { return Vector2D(x: left.x + right.x, y: left.y + right.y)}

func += (inout left: Vector2D, right: Vector2D) { left = left + right}

let vector = Vector2D(x: 1.0, y: 2.0) + Vector2D(x: 0.5, y: -1.0) // {x: 1.5, y: 1.0}

vector += Vector2D(x: 1.0, y: 2.0) // {x: 2.5, y: 3.0}

Page 148: Mera Dev Fest - Swift vs. Obj-C

func + (left: Vector2D, right: Vector2D) -> Vector2D { return Vector2D(x: left.x + right.x, y: left.y + right.y)}

func += (inout left: Vector2D, right: Vector2D) { left = left + right}

let vector = Vector2D(x: 1.0, y: 2.0) + Vector2D(x: 0.5, y: -1.0) // {x: 1.5, y: 1.0}

vector += Vector2D(x: 1.0, y: 2.0) // {x: 2.5, y: 3.0}

infix operator ** {}

Page 149: Mera Dev Fest - Swift vs. Obj-C

func + (left: Vector2D, right: Vector2D) -> Vector2D { return Vector2D(x: left.x + right.x, y: left.y + right.y)}

func += (inout left: Vector2D, right: Vector2D) { left = left + right}

let vector = Vector2D(x: 1.0, y: 2.0) + Vector2D(x: 0.5, y: -1.0) // {x: 1.5, y: 1.0}

vector += Vector2D(x: 1.0, y: 2.0) // {x: 2.5, y: 3.0}

infix operator ** {}func ** (left: Double, right: Double) -> Double {

Page 150: Mera Dev Fest - Swift vs. Obj-C

func + (left: Vector2D, right: Vector2D) -> Vector2D { return Vector2D(x: left.x + right.x, y: left.y + right.y)}

func += (inout left: Vector2D, right: Vector2D) { left = left + right}

let vector = Vector2D(x: 1.0, y: 2.0) + Vector2D(x: 0.5, y: -1.0) // {x: 1.5, y: 1.0}

vector += Vector2D(x: 1.0, y: 2.0) // {x: 2.5, y: 3.0}

infix operator ** {}func ** (left: Double, right: Double) -> Double { return pow(left, right)

Page 151: Mera Dev Fest - Swift vs. Obj-C

func + (left: Vector2D, right: Vector2D) -> Vector2D { return Vector2D(x: left.x + right.x, y: left.y + right.y)}

func += (inout left: Vector2D, right: Vector2D) { left = left + right}

let vector = Vector2D(x: 1.0, y: 2.0) + Vector2D(x: 0.5, y: -1.0) // {x: 1.5, y: 1.0}

vector += Vector2D(x: 1.0, y: 2.0) // {x: 2.5, y: 3.0}

infix operator ** {}func ** (left: Double, right: Double) -> Double { return pow(left, right)}

Page 152: Mera Dev Fest - Swift vs. Obj-C

func + (left: Vector2D, right: Vector2D) -> Vector2D { return Vector2D(x: left.x + right.x, y: left.y + right.y)}

func += (inout left: Vector2D, right: Vector2D) { left = left + right}

let vector = Vector2D(x: 1.0, y: 2.0) + Vector2D(x: 0.5, y: -1.0) // {x: 1.5, y: 1.0}

vector += Vector2D(x: 1.0, y: 2.0) // {x: 2.5, y: 3.0}

infix operator ** {}func ** (left: Double, right: Double) -> Double { return pow(left, right)}

Page 153: Mera Dev Fest - Swift vs. Obj-C

func + (left: Vector2D, right: Vector2D) -> Vector2D { return Vector2D(x: left.x + right.x, y: left.y + right.y)}

func += (inout left: Vector2D, right: Vector2D) { left = left + right}

let vector = Vector2D(x: 1.0, y: 2.0) + Vector2D(x: 0.5, y: -1.0) // {x: 1.5, y: 1.0}

vector += Vector2D(x: 1.0, y: 2.0) // {x: 2.5, y: 3.0}

infix operator ** {}func ** (left: Double, right: Double) -> Double { return pow(left, right)}

5 ** 2 // 25.0

Page 154: Mera Dev Fest - Swift vs. Obj-C

func + (left: Vector2D, right: Vector2D) -> Vector2D { return Vector2D(x: left.x + right.x, y: left.y + right.y)}

func += (inout left: Vector2D, right: Vector2D) { left = left + right}

let vector = Vector2D(x: 1.0, y: 2.0) + Vector2D(x: 0.5, y: -1.0) // {x: 1.5, y: 1.0}

vector += Vector2D(x: 1.0, y: 2.0) // {x: 2.5, y: 3.0}

infix operator ** {}func ** (left: Double, right: Double) -> Double { return pow(left, right)}

5 ** 2 // 25.013 ** 2 // 169.0

Page 155: Mera Dev Fest - Swift vs. Obj-C

Перечисления Enum

Page 156: Mera Dev Fest - Swift vs. Obj-C

“Ассоциированные” значения

• Каждый объект перечисления может содержать объект другого типа в качестве соответствия

• В таком случае их типы могут быть разными

• Позволяет “ассоциировать” любую информацию

Page 157: Mera Dev Fest - Swift vs. Obj-C

enum Barcode { case UPCA(Int, Int, Int) case PDF417(String) }

var productBarcode = Barcode.UPCA(1, 2, 3) productBarcode = .PDF417("ABCD")

Page 158: Mera Dev Fest - Swift vs. Obj-C

Ассоциированные значения доступны в switch-case конструкции

Page 159: Mera Dev Fest - Swift vs. Obj-C

Ассоциированные значения доступны в switch-case конструкции

switch productBarcode {

Page 160: Mera Dev Fest - Swift vs. Obj-C

Ассоциированные значения доступны в switch-case конструкции

switch productBarcode {case .UPCA(let system, let ident, let check):

Page 161: Mera Dev Fest - Swift vs. Obj-C

Ассоциированные значения доступны в switch-case конструкции

switch productBarcode {case .UPCA(let system, let ident, let check): println("UPCA with value of \(system), \(ident), \(check).")

Page 162: Mera Dev Fest - Swift vs. Obj-C

Ассоциированные значения доступны в switch-case конструкции

switch productBarcode {case .UPCA(let system, let ident, let check): println("UPCA with value of \(system), \(ident), \(check).")case .PDF417(let code):

Page 163: Mera Dev Fest - Swift vs. Obj-C

Ассоциированные значения доступны в switch-case конструкции

switch productBarcode {case .UPCA(let system, let ident, let check): println("UPCA with value of \(system), \(ident), \(check).")case .PDF417(let code): println("PDF417 with value of \(code).")

Page 164: Mera Dev Fest - Swift vs. Obj-C

Ассоциированные значения доступны в switch-case конструкции

switch productBarcode {case .UPCA(let system, let ident, let check): println("UPCA with value of \(system), \(ident), \(check).")case .PDF417(let code): println("PDF417 with value of \(code).")}

Page 165: Mera Dev Fest - Swift vs. Obj-C

Ассоциированные значения доступны в switch-case конструкции

switch productBarcode {case .UPCA(let system, let ident, let check): println("UPCA with value of \(system), \(ident), \(check).")case .PDF417(let code): println("PDF417 with value of \(code).")}

Page 166: Mera Dev Fest - Swift vs. Obj-C

Ассоциированные значения доступны в switch-case конструкции

switch productBarcode {case .UPCA(let system, let ident, let check): println("UPCA with value of \(system), \(ident), \(check).")case .PDF417(let code): println("PDF417 with value of \(code).")}

// Syntax sugar

Page 167: Mera Dev Fest - Swift vs. Obj-C

Ассоциированные значения доступны в switch-case конструкции

switch productBarcode {case .UPCA(let system, let ident, let check): println("UPCA with value of \(system), \(ident), \(check).")case .PDF417(let code): println("PDF417 with value of \(code).")}

// Syntax sugarswitch productBarcode {

Page 168: Mera Dev Fest - Swift vs. Obj-C

Ассоциированные значения доступны в switch-case конструкции

switch productBarcode {case .UPCA(let system, let ident, let check): println("UPCA with value of \(system), \(ident), \(check).")case .PDF417(let code): println("PDF417 with value of \(code).")}

// Syntax sugarswitch productBarcode {case let .UPCA(system, ident, check):

Page 169: Mera Dev Fest - Swift vs. Obj-C

Ассоциированные значения доступны в switch-case конструкции

switch productBarcode {case .UPCA(let system, let ident, let check): println("UPCA with value of \(system), \(ident), \(check).")case .PDF417(let code): println("PDF417 with value of \(code).")}

// Syntax sugarswitch productBarcode {case let .UPCA(system, ident, check): println("UPCA with value of \(system), \(ident), \(check).")

Page 170: Mera Dev Fest - Swift vs. Obj-C

Ассоциированные значения доступны в switch-case конструкции

switch productBarcode {case .UPCA(let system, let ident, let check): println("UPCA with value of \(system), \(ident), \(check).")case .PDF417(let code): println("PDF417 with value of \(code).")}

// Syntax sugarswitch productBarcode {case let .UPCA(system, ident, check): println("UPCA with value of \(system), \(ident), \(check).")case let .PDF417(code):

Page 171: Mera Dev Fest - Swift vs. Obj-C

Ассоциированные значения доступны в switch-case конструкции

switch productBarcode {case .UPCA(let system, let ident, let check): println("UPCA with value of \(system), \(ident), \(check).")case .PDF417(let code): println("PDF417 with value of \(code).")}

// Syntax sugarswitch productBarcode {case let .UPCA(system, ident, check): println("UPCA with value of \(system), \(ident), \(check).")case let .PDF417(code): println("PDF417 with value of \(code).")

Page 172: Mera Dev Fest - Swift vs. Obj-C

Ассоциированные значения доступны в switch-case конструкции

switch productBarcode {case .UPCA(let system, let ident, let check): println("UPCA with value of \(system), \(ident), \(check).")case .PDF417(let code): println("PDF417 with value of \(code).")}

// Syntax sugarswitch productBarcode {case let .UPCA(system, ident, check): println("UPCA with value of \(system), \(ident), \(check).")case let .PDF417(code): println("PDF417 with value of \(code).")}

Page 173: Mera Dev Fest - Swift vs. Obj-C

“Замещающие” значения

• Каждый объект перечисления может быть сопоставлен с объектом другого типа

• “Замещающие” значения не меняются (в отличие от “ассоциированных”

• Допустимые типы: Character, String, Double, Float, Int*

Page 174: Mera Dev Fest - Swift vs. Obj-C

// для Int работает auto-increment enum Number: Int { case One = 1, Two, Three, Four, Five, Six, Seven, Eight, FortyTwo = 42 }

enum APIMethod: String { case GET = "GET" case POST = "POST" case DELETE = "DELETE" case PUT = "PUT" case HEAD = "HEAD" } func request(method: APIMethod) { var req = NSMutableURLRequest() req.HTTPMethod = method.toRaw() //... }

Page 175: Mera Dev Fest - Swift vs. Obj-C

Скорость?

Page 176: Mera Dev Fest - Swift vs. Obj-C
Page 177: Mera Dev Fest - Swift vs. Obj-C
Page 178: Mera Dev Fest - Swift vs. Obj-C

Objective-C + Swift

Page 179: Mera Dev Fest - Swift vs. Obj-C

Готовимся

typedef enum { StatusSuccess, StatusFailure } Status

typedef NS_ENUM(NSInteger, Status) { StatusSuccess, StatusFailure };

Page 180: Mera Dev Fest - Swift vs. Obj-C

+ (id)sharedInstance { //your singleton magic }

+ (instancetype)sharedInstance { //singleton magic }

- (instancetype)init { //initial magic }

Page 181: Mera Dev Fest - Swift vs. Obj-C
Page 182: Mera Dev Fest - Swift vs. Obj-C

• В существующей Objective-C codebase -> New File - Cocoa Touch Class -> Swift ->Configure Header

Page 183: Mera Dev Fest - Swift vs. Obj-C

• В существующей Objective-C codebase -> New File - Cocoa Touch Class -> Swift ->Configure Header

• В созданный Bridging Header импортируем все, что Swift должен видеть из Obj-C#import “MyAFAPIClient.h”

Page 184: Mera Dev Fest - Swift vs. Obj-C

• В существующей 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”

Page 185: Mera Dev Fest - Swift vs. Obj-C

• В существующей 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 {…}

Page 186: Mera Dev Fest - Swift vs. Obj-C

Конвенции//Person.h @interface Person @property (nonatomic, strong) NSString *name; + (instancetype)personWithName:(NSString *)name; + (instancetype)person; @end

//MyApp-Bridging-Header.h #import "Person.h"

//Main.swift class Main { var person1: Person var person2: Person init() { person1 = Person(name: "Sergey") person2 = Person() } }

Page 187: Mera Dev Fest - Swift vs. Obj-C

Недоступны из Swift в Obj-C

• Swift enum

• Вложенные классы

• Перегруженные операторы

• Swift Extensions (Categories)

• Функции (вне классов)

Page 188: Mera Dev Fest - Swift vs. Obj-C

Недоступны из Obj-C в Swift

• Objective-C++ (.mm)

• typedef enum -> только NS_ENUM

• id -> AnyObject?

Page 189: Mera Dev Fest - Swift vs. Obj-C

Школа

Page 190: Mera Dev Fest - Swift vs. Obj-C
Page 191: Mera Dev Fest - Swift vs. Obj-C

4 занятия20 участников

Скринкасты на YouTube Презентации на SlideShare

Page 192: Mera Dev Fest - Swift vs. Obj-C

Резюме

Page 193: Mera Dev Fest - Swift vs. Obj-C
Page 194: Mera Dev Fest - Swift vs. Obj-C

• Защита от ошибок

Page 195: Mera Dev Fest - Swift vs. Obj-C

• Защита от ошибок

• Модификаторы доступ

Page 196: Mera Dev Fest - Swift vs. Obj-C

• Защита от ошибок

• Модификаторы доступ

• Optionals

Page 197: Mera Dev Fest - Swift vs. Obj-C

• Защита от ошибок

• Модификаторы доступ

• Optionals

• “Обновлённый“ switch-case

Page 198: Mera Dev Fest - Swift vs. Obj-C

• Защита от ошибок

• Модификаторы доступ

• Optionals

• “Обновлённый“ switch-case

• Никаких try-catch - “умный” код

Page 199: Mera Dev Fest - Swift vs. Obj-C

• Защита от ошибок

• Модификаторы доступ

• Optionals

• “Обновлённый“ switch-case

• Никаких try-catch - “умный” код

• Обаятельная инициализация

Page 200: Mera Dev Fest - Swift vs. Obj-C

• Защита от ошибок

• Модификаторы доступ

• Optionals

• “Обновлённый“ switch-case

• Никаких try-catch - “умный” код

• Обаятельная инициализация

• Playgrounds

Page 201: Mera Dev Fest - Swift vs. Obj-C

• Защита от ошибок

• Модификаторы доступ

• Optionals

• “Обновлённый“ switch-case

• Никаких try-catch - “умный” код

• Обаятельная инициализация

• Playgrounds

• “Сладкий” синтаксис

Page 202: Mera Dev Fest - Swift vs. Obj-C

• Защита от ошибок

• Модификаторы доступ

• Optionals

• “Обновлённый“ switch-case

• Никаких try-catch - “умный” код

• Обаятельная инициализация

• Playgrounds

• “Сладкий” синтаксис

• Перегрузка операторов

Page 203: Mera Dev Fest - Swift vs. Obj-C

• Защита от ошибок

• Модификаторы доступ

• Optionals

• “Обновлённый“ switch-case

• Никаких try-catch - “умный” код

• Обаятельная инициализация

• Playgrounds

• “Сладкий” синтаксис

• Перегрузка операторов

• Совместимость Obj-C <-> Swift

Page 204: Mera Dev Fest - Swift vs. Obj-C

https://www.appintheair.mobi/download