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

Discovering Native Swift Patterns

Discovering Native Swift Patterns

Nick O'Neill

June 09, 2016
Tweet

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