Objective-Chaos (A Grande Mudança de 2014™)

Objective-Chaos (A Grande Mudança de 2014™)

Palestra apresentada no Mobcamp em 05/08/14 sobre novidades do iOS 8: Swift, extensions, indícios de novos tamanhos de tela e Cloud Kit.

841a0284060fa6faa652e95a467dcc69?s=128

Marcelo Fabri

August 05, 2014
Tweet

Transcript

  1. Objec&ve(Chaos

  2. Marcelo(Fabri • Desenvolve)para)iOS)desde)2010 • ~)10)apps • WWDC)2014)Student)Scholarship • 4)tutoriais)no)RayWenderlich.com •

    Movile • Unicamp • @marcelofabri_
  3. None
  4. None
  5. None
  6. None
  7. None
  8. None
  9. In#two#hours,#Apple#shut#me#up.# They#pre4y#much#offered#a#solu9on# for#every#single#thing#I#have#bitched# about#over#the#past#five#years.# —"Jus&n"Williams"(@jus&n)

  10. In#many#ways,#WWDC#2014#was# the#year#that#Apple#fixed#their#shit. —"Ma%t"Thompson"(@ma%t)

  11. Non#Disclosure+Agreement

  12. A"Grande"Mudança"de"2014™

  13. Apps$que$não$eram$possíveis$agora$são Restrições)que)exis-am)não)existem)mais

  14. Swi$ Extensions Novos%tamanhos%de%tela%(?!) CloudKit

  15. None
  16. Por$quê$outra$linguagem$de$ programação?!

  17. None
  18. • “Safe'by'design” • Generics • Enums • Tuplas • Sobrecarga'de'operadores

    • Sem'headers'e'ponto<e<vírgulas • Namespaces* • Funcional?
  19. Qual%a%cara%disso?

  20. class Pessoa : Equatable { let nome : String var

    apelido : String? init(nome:String, apelido:String? = nil) { self.nome = nome self.apelido = apelido } func nomeExibicao() -> String { if let apelido = self.apelido { return "\(nome) (\(apelido))" } return "\(nome)" } } func ==(lhs: Pessoa, rhs: Pessoa) -> Bool { return lhs.nome == rhs.nome }
  21. let marcelo = Pessoa(nome: "Marcelo Fabri") println(marcelo.nomeExibicao()) let felipao =

    Pessoa(nome: "Luiz Felipe Scolari", apelido: "Felipão") println(felipao.nomeExibicao()) felipao.apelido = "Dona Lúcia" println(felipao.nomeExibicao()) Marcelo Fabri Luiz Felipe Scolari (Felipão) Luiz Felipe Scolari (Dona Lúcia)
  22. Safe%by%design

  23. Op#onals Sem$conversões$implícitas Sem$ponteiros

  24. let pessoas = [marcelo, felipao] if let idx = find(pessoas,

    felipao) { println("achou no indice \(idx)") } else { println("nao achou") }
  25. if let johnsStreet = john.residence?.address?.street { println("John's street name is

    \(johnsStreet).") } else { println("Unable to retrieve the address.") }
  26. Super&Enums

  27. enum Method: String { case OPTIONS = "OPTIONS" case GET

    = "GET" case HEAD = "HEAD" case POST = "POST" case PUT = "PUT" case PATCH = "PATCH" case DELETE = "DELETE" case TRACE = "TRACE" case CONNECT = "CONNECT" } Method.GET.toRaw() // "GET" Method.fromRaw("INVALID") // nil Method.fromRaw("GET") // Method.GET
  28. enum ParameterEncoding { case URL case JSON(options: NSJSONWritingOptions) case PropertyList(format:

    NSPropertyListFormat, options: NSPropertyListWriteOptions) func encode(request: NSURLRequest, parameters: [String: AnyObject]?) -> (NSURLRequest, NSError?) { ... } } h"ps:/ /github.com/Alamofire/Alamofire
  29. Compa&vel*com Objec&ve(C

  30. Swi$%ainda%é%Beta!

  31. None
  32. None
  33. Today Keyboards Share Ac#ons Photo%edi)ng Document)provider

  34. None
  35. None
  36. h"ps:/ /github.com/jonomuller/Hodor7Keyboard

  37. Extensions)fazem)parte)de)um)app

  38. You$can’t$submit$an$extension$to$the$ App$Store$unless$it’s$inside$a$ containing$app. —"App"Extension"Programming"Guide

  39. In#addi'on,#your#containing#app# must#provide#func'onality#to#iOS# users;#it#can’t#just#contain# extensions. —"App"Extension"Programming"Guide

  40. Cada$extension$é$um$target$separado

  41. By#default,#your#containing#app#and# its#extensions#have#no#direct#access# to#each#other’s#containers. —"App"Extension"Programming"Guide

  42. None
  43. let defaults = NSUserDefaults(suiteName: "com.mobcamp.exemplo") defaults.setObject("Marcelo", forKey: "palestrante") defaults.synchronize()

  44. Novos%tamanhos%de%tela%(?!)

  45. Indícios

  46. Resizable)simulators

  47. Size%Classes

  48. None
  49. Auto%Layout + Storyboards

  50. For$the$self$aware$App,$a$device$ rota4on$is$only$an$animated$bounds$ change. —"WWDC"2014"Session"#214

  51. None
  52. None
  53. CloudKit

  54. None
  55. O"que"é?

  56. Transporte,+não+persistência Público(x(Privado Usa$conta$do$iCloud Banco&estruturado,&com&relacionamentos Assets No#ficações

  57. Limitações

  58. Compar'lhamento/grupos Não$existem$APIs$para$o$banco$público Somente'OS'X'e'iOS Impossível*rodar*código*na*nuvem

  59. Bônus: Informações,do,usuário

  60. let container = CKContainer.defaultContainer() container.fetchUserRecordIDWithCompletionHandler { (recordID, error) in if

    !error { println(recordID.recordName) container.requestApplicationPermission(.PermissionUserDiscoverability) { (status, permissionError) in if status == CKApplicationPermissionStatus.Granted { container.discoverUserInfoWithUserRecordID(recordID) { (info, fetchError) in println("\(info.firstName) \(info.lastName)") } } } } } _4bb0c41f2bd6e1c6b888025d01f772c5 ➤ único por iCloud + app Marcelo Fabri h"ps:/ /gist.github.com/marcelofabri/0a722c477ec245d6fc3e
  61. Recaptulando

  62. Swi$

  63. Extensions

  64. Tamanhos(de(tela(e mul$task

  65. CloudKit

  66. None
  67. None
  68. Aproveite)esse momento&único!

  69. @marcelofabri_ me@marcelofabri.com marcelofabri.com