Slide 1

Slide 1 text

4BGFS /FUXPSLJOH -BZFSXJUI 4XJGU

Slide 2

Slide 2 text

8IPBN* w :VTFJ/JTIJZBNB !ZVTFJOJTIJZBNB w J04EFWFMPQFSZFBST w $PPLQBE w *OUFSOBUJPOBMHSPVQ w -FBSOJOH&OHMJTI

Slide 3

Slide 3 text

(MPCBM

Slide 4

Slide 4 text

1MFBTFGPSHJWFNF

Slide 5

Slide 5 text

5IJTJTB3VCZ NFFUVQ

Slide 6

Slide 6 text

#VU*`Nʜ wXPSLJOHGPSBOJ04 BQQMJDBUJPO w*IBWFWFSZMJUUMF FYQFSJFODFPG3BJMT 3VCZBTXFMM

Slide 7

Slide 7 text

"T"NPCJMF EFWFMPQFS *XBOU ZPVUPLOPXBCPVUʜ

Slide 8

Slide 8 text

4XJGU

Slide 9

Slide 9 text

8IZTIPVMEXF VTF4XJGU

Slide 10

Slide 10 text

[CKDPantrymanInitializer setVariables]; [[CKDPushNotificationManager sharedManager] start]; [[CKDPushNotificationManager sharedManager] registerForRemoteNotification]; [[CKDBargainManager sharedManager] start]; [[CKDDeviceTrackingManager sharedManager] start]; [[CKDInitializeConfigManager sharedManager] start]; [[CKDSupportContactsManager sharedManager] start]; [[CKDAccountManager sharedManager] migrateStoredAccount]; [[CKDGoogleAnalyticsManager sharedManager] startTracking]; [[CKDHistoryManager sharedManager] load]; [[CKDRecipesManager sharedManager] load]; #FDBVTFPG0CKFDUJWF$ TZOUBY /P JU`TOPU
 4FFUIFHFPNFUSJDCFBVUZ

Slide 11

Slide 11 text

0CKFDUJWF$JTMJLF3VCZ wEZOBNJDEJTQBUDI wEZOBNJDUZQJOH wSFqFDUJPONFUIPET wSVOUJNFIBDLFSZ

Slide 12

Slide 12 text

1SPT w-FTTWFSCPTF w:PVDBOTFFZPVSSFTVMU JNNFEJBUFMZ w'BTURVJDLEFWFMPQNFOU DZDMFTBOEQSPUPUZQJOH

Slide 13

Slide 13 text

1SPT NSArray *array = @[[Recipe new]]; BOOL boolValue = [array[0] boolValue]; :PVDBOEPBOZUIJOHZPVXBOUUP 4VQFSC name = "John" name = Time.now() name = 123.45

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

$POT w$SBTIFTPOl3VOUJNFz w1PPSQFSGPSNBODF w1PPSJOUFHSBUJPOXJUI *%&T

Slide 16

Slide 16 text

8PSLJOHPOJ04

Slide 17

Slide 17 text

8FIBWFUIFQSFUUZ OJDFQBSUOFS You can’t release such a crap! Wait until I finish reviewing There are no exceptions

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

http://appreviewtimes.com/

Slide 21

Slide 21 text

J040CKFDUJWF$ w&SSPSQSPOF w)BSEUPSFDPWFS

Slide 22

Slide 22 text

.BLFFWFSZUIJOH NPSFSFMJBCMF

Slide 23

Slide 23 text

4XJGU

Slide 24

Slide 24 text

4XJGU w5ZQFTBGF w/VMMTBGF w:PVDBOpOETPNFUIJOH XSPOHPOlDPNQJMF UJNFz

Slide 25

Slide 25 text

/FUXPSLJOH

Slide 26

Slide 26 text

*O0CKFDUJWF$ NSDictionary *parameters = @{ @"page": @(page), @"per_page": @10, }; [client requestGetWithPath:path parameters:parameters completion:^(NSArray *recipes, NSError *error) { if (nil == error) { } else { } }]; There are 4 possibilities The type of response is determined dynamically SFDJQFTOJM SFDJQFTOJM FSSPSOJM GBJMVSF FSSPSOJM TVDDFTT

Slide 27

Slide 27 text

*O4XJGU let params = PaginationParams(order: .Desc(field: .Publish), page: 1, perPage: 10) let api = APIs.Recipes.Get(paginationParams: params) SharedAPIClient.sendRequest(api) { response in switch response { case .Success(let value): value[0].cookingTime case .Failure(let value): value.message } } The type of the response can be determined statically You can handle success and failure exhaustively

Slide 28

Slide 28 text

&OVN enum Order : Printable { enum Field: Printable { case Update, Publish var description: String { switch self { case .Update: return "updated_at" case .Publish: return "published_at" } } } case Desc(field: Field), Asc(field: Field) var description: String { switch self { case .Desc(let field): return "\(field)_desc" case .Asc(let field): return "\(field)_asc" } } } Enum can conform protocols Enum can have properties and functions You can associate a value with an enum let params = PaginationParams(order: .Desc(field: .Publish), page: 1, perPage: 10)

Slide 29

Slide 29 text

1SPUPDPM protocol API { typealias ResponseType class Recipes { class Get: API { typealias ResponseType = PagedRecipes Associated Types A type conform the protocol can determine an actual type

Slide 30

Slide 30 text

(FOFSJDT func sendRequest(API: T, handler: (T.ResponseType) -> Void) Generic functions Associated Types

Slide 31

Slide 31 text

&JUIFS public enum Result { case Success(T) case Failure(E) } Generics Enum with associated value

Slide 32

Slide 32 text

/VMMBCJMJUZ *NNVUBCJMJUZ struct Recipe { var id: Int? var title = "" let user: User This can be nil This is immutable This can’t be nil and has default value This can’t be nil

Slide 33

Slide 33 text

1VUFWFSZUIJOHUPHFUIFS let params = PaginationParams(order: .Desc(field: .Publish), page: 1, perPage: 10) let api = APIs.Recipes.Get(paginationParams: params) SharedAPIClient.sendRequest(api) { response in switch response { case .Success(let value): value[0].cookingTime case .Failure(let value): value.message } } Enum Nested Classes Either Associated Value Protocol With Associated Type

Slide 34

Slide 34 text

4VNNBSZ

Slide 35

Slide 35 text

w0CKFDUJWF$˺3VCZ w0CKFDUJWF$4XJGU w3VCZ4XJGU w4XJGUNBLFTZPVS BQQMJDBUJPOTSFMJBCMF

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text

*T4XJGU QSPEVDUJPO RVBMJUZ

Slide 38

Slide 38 text

0GDPVSTF w0VS JOUFSOBUJPOBM J04 BQQMJDBUJPODPOTJTUTPG 4XJGU w*SFXSPUFBMNPTUPGUIF 0CKFDUJWF$DPEFJOUP 4XJGUPSNPOUIBHP

Slide 39

Slide 39 text

ૣ͘͠Ζ Hurry up! Date prisa! اولجع! Cepatlah!

Slide 40

Slide 40 text

8FBSFIJSJOH

Slide 41

Slide 41 text

"OZRVFTUJPOT