Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Discovering Native Swift Patterns

Discovering Native Swift Patterns

Avatar for Nick O'Neill

Nick O'Neill

June 09, 2016
Tweet

Other Decks in Programming

Transcript

  1. Discovering Na.ve Swi1 Pa3erns Developing clear, consise code Nick O'Neill

    • @nickoneill Discovering Na.ve Swi1 Pa3erns • June 9th, 2016
  2. How can I express what I'm doing more clearly? Discovering

    Na.ve Swi1 Pa3erns • June 9th, 2016
  3. the objec)ve-c way if (indexPath.section == 0) { if (indexPath.row

    == 0) { cell.textLabel.text = @"Twitter" } else if (indexPath.row == 1) { cell.textLabel.text = @"Blog" } else { cell.textLabel.text = @"Contact Us" } } else { if (indexPath.row == 0) { cell.textLabel.text = @“@nickoneill" } else if (indexPath.row == 1) { cell.textLabel.text = @“@objctoswift" } else { cell.textLabel.text = @“@whyareyousodumb" } } Discovering Na.ve Swi1 Pa3erns • June 9th, 2016
  4. a be%er? swi+ way let shortPath = (indexPath.section, indexPath.row) switch

    shortPath { case (0, 0): cell.textLabel.text = "Twitter" case (0, 1): cell.textLabel.text = "Blog" case (0, 2): cell.textLabel.text = "Contact Us" case (1, 0): cell.textLabel.text = “@nickoneill" case (1, 1): cell.textLabel.text = “@objctoswift" case (1, 2): cell.textLabel.text = “@whyareyousodumb" default: cell.textLabel.text = "¯\\_(ϑ)_/¯" } Discovering Na.ve Swi1 Pa3erns • June 9th, 2016
  5. the best? swi* way enum TwitterHandles: Int { case Nickoneill

    case Objctoswift case Whyareyousodumb func labelText() -> String { switch self { ... } } } let rowData = TwitterHandles(rawValue: indexPath.row) cell.textLabel.text = rowData.labelText() Discovering Na.ve Swi1 Pa3erns • June 9th, 2016
  6. Our idea of the best Swi/ pa1erns will change over

    8me Discovering Na.ve Swi1 Pa3erns • June 9th, 2016
  7. Not every piece of clever code is a great pa0ern

    Discovering Na.ve Swi1 Pa3erns • June 9th, 2016
  8. swi$ func mainToBackground(background: () -> (), main: () -> ())

    { let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT dispatch_async(dispatch_get_global_queue(priority, 0)) { background() dispatch_async(dispatch_get_main_queue()) { main() } } } mainToBackground({ // do some task }, { // update the ui }) Discovering Na.ve Swi1 Pa3erns • June 9th, 2016
  9. swi$? { /* do some task */ } ~> {

    /* update some UI */} Discovering Na.ve Swi1 Pa3erns • June 9th, 2016
  10. class ViewController: UIViewController { let imageView = UIImageView() let goButton

    = UIButton() override func viewDidLoad() { imageView.image = UIImage(named: "profile") view.addSubview(imageView) goButton.frame = CGRect(x: 0, y: 0, width: 30, height: 30) goButton.setTitle("GO!", forState: .Normal) view.addSubview(goButton) } } Discovering Na.ve Swi1 Pa3erns • June 9th, 2016
  11. class ViewController: UIViewController { let imageView: UIImageView = { let

    imageView = UIImageView() imageView.image = UIImage(named: "profile") return imageView }() let goButton: UIButton = { let button = UIButton() button.frame = CGRect(x: 0, y: 0, width: 30, height: 30) button.setTitle("GO!", forState: .Normal) return button }() override func viewDidLoad() { view.addSubview(imageView) view.addSubview(goButton) } } Discovering Na.ve Swi1 Pa3erns • June 9th, 2016
  12. @IBOutlet weak var arrivalLabel: UILabel! { didSet { arrivalLabel.text =

    "Arriving in 10 minutes".uppercaseString arrivalLabel.font = UIFont(name: "Lato", size: 11) arrivalLabel.textColor = UIColor.blueColor() arrivalLabel.textAlignment = .Center arrivalLabel.numberOfLines = 1 } } Discovering Na.ve Swi1 Pa3erns • June 9th, 2016
  13. override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) if let paths =

    tableView.indexPathsForSelectedRows { for path in paths { tableView.deselectRowAtIndexPath(path, animated: true) } } } Discovering Na.ve Swi1 Pa3erns • June 9th, 2016
  14. Unboxing1, or any JSON -> struct framework let json =

    try? NSJSONSerialization.JSONObjectWithData(data, options: []) if let object = json as? Dictionary<String, AnyObject>, places: [Place] = Unbox(object) { return places } 1 h$ps:/ /github.com/JohnSundell/Unbox Discovering Na.ve Swi1 Pa3erns • June 9th, 2016
  15. struct Place: Unboxable { let id: String let address: Int?

    let text: String init(unboxer: Unboxer) { self.id = unboxer.unbox("id") self.address = unboxer.unbox("address") self.placeName = unboxer.unbox("place_name") } } Discovering Na.ve Swi1 Pa3erns • June 9th, 2016
  16. struct Place { // ... init?(json: Dictionary<String, AnyObject>) { guard

    let id = json["_id"] as? String else { return nil } self.id = id self.address = json["address"] as? Int self.placeName = (json["name"] as? String) ?? "No place name" } } Discovering Na.ve Swi1 Pa3erns • June 9th, 2016
  17. Smart architecture decisions are just big pa4erns • Networking •

    Core Data • No0fica0onCenter/KVO/delegates Discovering Na.ve Swi1 Pa3erns • June 9th, 2016
  18. Tips for finding new pa0erns • Develop an intui.on for

    code smell • Experiment in playgrounds or simplified projects • Re-read the language guide • Keep things clear Discovering Na.ve Swi1 Pa3erns • June 9th, 2016