Protocols promised-land-2

51
Protocols and the Promised Land @MicheleTitolo

Transcript of Protocols promised-land-2

Page 1: Protocols promised-land-2

Protocols and the Promised Land

@MicheleTitolo

Page 2: Protocols promised-land-2

Swift is shiny! And new!

Page 3: Protocols promised-land-2

Swift is not Objective-C

Page 4: Protocols promised-land-2

Interop

Page 5: Protocols promised-land-2

as? as? as?

Page 6: Protocols promised-land-2

as? lies

Page 7: Protocols promised-land-2

đźš«let vendor = ObjcObject() let items = vendor.giveMeItems() as? [Fruit]

Page 8: Protocols promised-land-2

let vendor = ObjcObject() let items = vendor.giveMeItems().map { $0 as Fruit }

Page 9: Protocols promised-land-2

@objc spreads like a virus

Page 10: Protocols promised-land-2

đźš«

@objc protocol SomeProtocol { func someFunc() }

class MyClass: SomeProtocol {}

Page 11: Protocols promised-land-2

@objc protocol SomeProtocol { func someFunc() }

@objc class MyClass: NSObject, SomeProtocol {}

Page 12: Protocols promised-land-2

Swift > Objc > Swift

Page 13: Protocols promised-land-2

Can’t #import “MyApp-Swift.h” in header

Page 14: Protocols promised-land-2

Can’t conform, can’t subclass

Page 15: Protocols promised-land-2

Bridging

Page 16: Protocols promised-land-2

many parts of Swift don’t bridge

Page 17: Protocols promised-land-2

Does this really need to be used in Objective-C?

Page 18: Protocols promised-land-2

framework headers can’t be in bridging header

Page 19: Protocols promised-land-2

use @import

Page 20: Protocols promised-land-2

Partial bridging

Page 21: Protocols promised-land-2

-Swift.h will leave out funcs/vars that don’t bridge

Page 22: Protocols promised-land-2

Again: does this really need to be bridged?

Page 23: Protocols promised-land-2

Type System

Page 24: Protocols promised-land-2

properties can have 1 type

Page 25: Protocols promised-land-2

protocol Themeable {} class ListViewController: UIViewController, Themeable {}

var themedViewController: // UIViewController, Themeable ????

Page 26: Protocols promised-land-2

two workarounds

Page 27: Protocols promised-land-2

public protocol ViewControllerProtocol { var view: UIView! { get } var storyboard: UIStoryboard? { get } init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) func viewDidLoad() // etc }

protocol ThemeableViewController: Themeable, ViewControllerProtocol {} var themedViewController: ThemeableViewController

Swift-y but hack-y

Page 28: Protocols promised-land-2

var themed: Themeable { get { return self.viewController as! Themeable } set(newThemeable) { if let themedViewController = newThemeable as? UIViewController{ viewController = themedViewController } } }

var viewController: UIViewController init<T where T: Themeable, T: UIViewController>(viewController: T) { self.viewController = viewController }

Also swfit-y also hack-y

Page 29: Protocols promised-land-2

Can’t override type with inheritance

Page 30: Protocols promised-land-2

đźš«Deep object hierarchies

Page 31: Protocols promised-land-2

Protocols

Page 32: Protocols promised-land-2

Composition instead of inheritance

Page 33: Protocols promised-land-2

Protocols and inheritance don’t mix

Page 34: Protocols promised-land-2

use POP to mock

Page 35: Protocols promised-land-2

Generics

Page 36: Protocols promised-land-2

Can’t reference a generic protocol

Page 37: Protocols promised-land-2

protocol Holder { typealias Item var items: [Item] { get } }

class Basket<Thing>: Holder{ var items: [Thing] = [] func add(item: Thing) { items.append(item) } }

Page 38: Protocols promised-land-2

đźš«đźš«

var someHolder: Holder var someBasket: Basket

Page 39: Protocols promised-land-2

đźš« var someHolder: Holder<Peach> var someBasket: Basket<Peach>

Page 40: Protocols promised-land-2

Covariance only works with generic classes

Page 41: Protocols promised-land-2

Covariance: If a Cat is an Animal func feed(animal: Animal) can receive a Cat

Page 42: Protocols promised-land-2

đźš«đźš«

typealias Object typealias Object: String typealias RoundObject: Object

Page 43: Protocols promised-land-2

generic classes can specify type requirements

Page 44: Protocols promised-land-2

class Basket<Thing: Fruit> { var items: [Thing] = [] func add(item: Thing) { items.append(item) } }

Page 45: Protocols promised-land-2

đźš«

class Basket<Thing: Fruit> { var items: [Thing] = [] func add(item: Thing) { items.append(item) } }

class FruitBasket: Basket<Fruit> {} class PeachBasket: FruitBasket<Peach> {}

Page 46: Protocols promised-land-2

đźš«class Bag<Stuff> { class Basket<Thing: Stuff> { var items: [Thing] = [] func add(item: Thing) { items.append(item) } } }

Page 47: Protocols promised-land-2

Generic non-NSObjects have issues

Page 48: Protocols promised-land-2

Explicitly call out class for now

Page 49: Protocols promised-land-2

Swift introduces awesome new patterns

Page 50: Protocols promised-land-2

Thanks!@MicheleTitolo

Page 51: Protocols promised-land-2

Photo Credits

• https://www.flickr.com/photos/83073191@N00/21709516808/

• https://www.flickr.com/photos/64181484@N04/21946459678/

• https://www.flickr.com/photos/66904032@N05/18905223864/

• https://www.flickr.com/photos/27454212@N00/22120629112/

• https://www.flickr.com/photos/8725928@N02/24439195435/

• https://www.flickr.com/photos/28480761@N04/24143685631/