Mejores Prácitcas Para el Desarrollo de Aplicaciones iOS con Swift

Mejores Prácitcas Para el Desarrollo de Aplicaciones iOS con Swift

En esta charla expuse una serie tips y consejos prácticos que he identificado durante mi tiempo como desarrollador Swift que te ayudarán a estructurar mejor tus aplicaciones iOS.

3bb2abb35d54dfe7c3179cb2d7c049e7?s=128

Oscar Swanros

August 31, 2016
Tweet

Transcript

  1. None
  2. Mejores Prácticas Para el Desarrollo de Aplicaciones iOS con Swift

  3. Oscar Swanros @Swanros swanros.com | swanros.tech | iosjobs.mx

  4. iOS Software Engineer

  5. I’ve seen ship

  6. Una buena app tiene como base una excelente arquitectura.

  7. Nope.

  8. Pero sí ayuda.

  9. Tips • Aprovecha la flexibilidad de los módulos • Minimiza

    tus dependencias • Reutiliza la mayor cantidad de código posible • Aprovecha el type-system de Swift • Piensa en el futuro • Una app nunca está 100% feature-complete por
 más de 300 días.
  10. Módulos

  11. class ContactView: UIView { private lazy var avatarImageView = AvatarImageView()

    } public class BaseOperation<T: JSONParselable>: P3NetworkOperation { } open class P3NetworkOperation: P3Operation { // MARK: - Private Support Types fileprivate enum OperationType { case GetData case Download } }
  12. Dependencias

  13. Swift se mueve rápido.

  14. None
  15. Reutilizar Código

  16. None
  17. None
  18. Aprovechar el type-system

  19. { "status": "error", "error_code": "authentication_required" } { "status": "success", "data":

    { "users": [ { "username": "anotherSwnanros", "profile_picture": null, "id": 2, "contact_status": 0 } ] } }
  20. public class BaseOperation<T: JSONParselable>: P3NetworkOperation { override public var headerParams:

    [String : String]? { var headers: [String:String] = [:] if let session = SessionManager.sharedManager.currentSession { headers["Authorization"] = "Token token=\"\(session.token)\"" } if [HTTPMethod.PUT, .PATCH, .POST].contains(method) { headers["Content-Type"] = "application/json" } return headers } public override func jsonDownloadComplete() { guard let json = downloadedJSON, let _result = json["result"] as? [String:AnyObject], let statusString = _result.p3_string(key: "status"), let status = CallicoAPIStatus(rawValue: statusString) else { finish(APIError: .malformedServerResponse) return } switch status { case .success: guard let data = _result["data"] as? [String:AnyObject], let parsedResult = T.with(json: data) else { finish(APIError: .malformedServerResponse) return } self.parsedResult = parsedResult generated(result: parsedResult) case .error: // ……. } } func generated(result: T) {} }
  21. public class GetContactsOperation: BaseOperation<ContactCollection> { public override var simpleEndpoint: EndpointConvertible

    { return Endpoint.contacts } public var contacts: ContactCollection? public init?() { super.init() } override func generated(result: ContactCollection) { contacts = result finish() } } guard let op = GetContactsOperation() else { return } queue.addOperation(op)
  22. public struct ContactCollection: JSONParselable, Collection, IteratorProtocol, CustomDebugStringConvertible, ExpressibleByArrayLiteral { }

    let contacts: ContactCollection = [firstContact, secondContact]
  23. Piensa en el futuro

  24. /users/:user_id/contact_request

  25. None
  26. ¿Preguntas?

  27. colimo.tech @swanros oscar@swanros.com