Slide 1

Slide 1 text

Macoun ⌘

Slide 2

Slide 2 text

Swifter Code in Objective-C(++)

Slide 3

Slide 3 text

Hintergrund

Slide 4

Slide 4 text

Hintergrund • Michael Ochs • iOS Entwickler seit iOS 3 • PSPDFKit GmbH

Slide 5

Slide 5 text

Hintergrund • Wir entwickeln ein Framework für über 1000 Kunden • Integriert in Apps von Dropbox, Evernote, Atlassian, … • Grosser Quelltext (> 600.000 loc) • Grosse öffentliche Schnittstelle (> 300 classes, > 70 protocols) • Distribuiert in Binärform

Slide 6

Slide 6 text

Die Probleme mit Swift

Slide 7

Slide 7 text

Die Probleme mit Swift • Keine Quelltext Kompatibilität • Keine Binär Kompatibilität • Immer noch Fehler in der Syntax • Keine std library Kompatibilität • Nicht nutzbar mit C++

Slide 8

Slide 8 text

Die Probleme mit Swift • Quelltext muss weiter funktionieren ohne Änderungen • Schnittstelle muss so stabil wie möglich bleiben • Distribution muss schnell und einfach möglich sein • Unterstützung der letzten zwei iOS Versionen

Slide 9

Slide 9 text

Die Probleme mit Swift Quelltext Kompatibilität • Breaking changes im Quelltext sind sehr kostspielig • Die meisten Stellen in jedem Quelltext werden selten geändert • Schreiben von Code erzeugt immer Fehler • Code zu ändern der vorher funktionierte erzeugt Fehler ohne erkennbaren Vorteil

Slide 10

Slide 10 text

Objective-C swifter machen

Slide 11

Slide 11 text

Objective-C swifter machen • Boiler plate code vermeiden • Eigene Helfer-Kategorien schreiben • An Swift orientieren • Helfer in Frameworks modularisieren • Sehr einfach über private CocoaPods zu lösen

Slide 12

Slide 12 text

Objective-C swifter machen @interface NSArray (Helper)
 
 - (NSArray *)pspdf_filtered:(BOOL(^)(ObjectType obj))block;
 
 - (NSArray *)pspdf_mapped:(id _Nullable (^)(ObjectType obj))block;
 
 - (NSArray *)pspdf_flattened;
 
 - (NSArray *)pspdf_mutatedArrayUsingBlock:
 (void (^)(NSMutableArray *array))block;
 
 @end

Slide 13

Slide 13 text

Objective-C swifter machen @interface NSArray (Helper)
 
 - (NSArray *)pspdf_filtered:(BOOL(^)(ObjectType obj))block;
 
 - (NSArray *)pspdf_mapped:(id _Nullable (^)(ObjectType obj))block;
 
 - (NSArray *)pspdf_flattened;
 
 - (NSArray *)pspdf_mutatedArrayUsingBlock:
 (void (^)(NSMutableArray *array))block;
 
 @end

Slide 14

Slide 14 text

Objective-C swifter machen @interface NSArray (Helper)
 
 - (NSArray *)pspdf_filtered:(BOOL(^)(ObjectType obj))block;
 
 - (NSArray *)pspdf_mapped:(id _Nullable (^)(ObjectType obj))block;
 
 - (NSArray *)pspdf_flattened;
 
 - (NSArray *)pspdf_mutatedArrayUsingBlock:
 (void (^)(NSMutableArray *array))block;
 
 @end

Slide 15

Slide 15 text

Objective-C swifter machen @interface NSArray (Helper)
 
 - (NSArray *)pspdf_filtered:(BOOL(^)(ObjectType obj))block;
 
 - (NSArray *)pspdf_mapped:(id _Nullable (^)(ObjectType obj))block;
 
 - (NSArray *)pspdf_flattened;
 
 - (NSArray *)pspdf_mutatedArrayUsingBlock:
 (void (^)(NSMutableArray *array))block;
 
 @end

Slide 16

Slide 16 text

Objective-C swifter machen @interface NSArray (Helper)
 
 - (NSArray *)pspdf_filtered:(BOOL(^)(ObjectType obj))block;
 
 - (NSArray *)pspdf_mapped:(id _Nullable (^)(ObjectType obj))block;
 
 - (NSArray *)pspdf_flattened;
 
 - (NSArray *)pspdf_mutatedArrayUsingBlock:
 (void (^)(NSMutableArray *array))block;
 
 @end

Slide 17

Slide 17 text

Demo

Slide 18

Slide 18 text

Objective-C++

Slide 19

Slide 19 text

Objective-C++ • Die ganze Macht von C++ in Objective-C Dateien • Aber nicht die ganze Komplexität von C++ • Objective-C mit ein bisschen C++ gewürzt • Einfach zu lernen, auch ohne C++ Erfahrung

Slide 20

Slide 20 text

Objective-C++ if let document = self.document {
 [self loadDocument:document]
 }

Slide 21

Slide 21 text

Objective-C++ #define let const auto
 
 if (let document = self.document) {
 [self loadDocument:document];
 }
 


Slide 22

Slide 22 text

Objective-C++ #define let const auto
 
 if (let document = self.document) {
 [self loadDocument:document];
 }
 


Slide 23

Slide 23 text

Objective-C++ #define let const auto
 
 if (let document = self.document) {
 [self loadDocument:document];
 }
 


Slide 24

Slide 24 text

Objective-C++ void(^handler)(NSData *,
 NSURLResponse *,
 NSError *) = ^(
 NSData *data,
 NSURLResponse *response,
 NSError *error) {
 // some handler
 };
 
 


Slide 25

Slide 25 text

Objective-C++ auto handler = ^(NSData *data,
 NSURLResponse *response,
 NSError *error) {
 // some handler
 };

Slide 26

Slide 26 text

Demo

Slide 27

Slide 27 text

Objective-C++ Objective-C C++ NSArray std::vector NSDictionary std::unordered_map NSSet std::unordered_set NSOrderedSet std::set std::map

Slide 28

Slide 28 text

Objective-C++ • Objective-C und C++ Objekte können beliebig vermischt werden • Objective-C collections für Objective-C Objekte und C++ collections für C++ Objekte und elementare Datentypen

Slide 29

Slide 29 text

Objective-C++ CGSize operator/(const CGSize &lhs, CGFloat f) { return CGSize{ lhs.width / f, lhs.height / f }; } CGSize zoomSize = self.bounds.size / zoomScale;

Slide 30

Slide 30 text

Objective-C++ CGSize operator/(const CGSize &lhs, CGFloat f) { return CGSize{ lhs.width / f, lhs.height / f }; } CGSize zoomSize = self.bounds.size / zoomScale; Operators

Slide 31

Slide 31 text

Nachteile von Objective-C++

Slide 32

Slide 32 text

Nachteile von Objective-C++ • Kompilieren dauert 2-3x länger wenn alle Dateien Objective-C++ sind • Es gibt mehr Warnungen, insbesondere bei impliziten Casts • Kein Refactoring in Xcode für Objective-C++

Slide 33

Slide 33 text

Nachteile von Objective-C++ • Achtung: Bei C++ können auch Klassen value types sein! • C++ sollte nicht in Headern verwendet werden • Kann dann nur noch in andere Objective-C++ Dateien importiert werden • Funktioniert nicht mit Swift • Wenn nicht vermeidbar: #ifdef __cplusplus

Slide 34

Slide 34 text

Zusammenfassung

Slide 35

Slide 35 text

Zusammenfassung • Swift hat eine menge Potential - aber ist noch nicht so weit • Es gibt eine menge Dinge die man bei Swift beachten muss • Eine Menge der neuen Features von Swift sind gar nicht so neu und können in anderen Sprachen schon länger benutzt werden

Slide 36

Slide 36 text

Danke Michael Ochs @_mochs https://pspdfkit.com/blog/

Slide 37

Slide 37 text

Macoun ⌘