Skip to content

Instantly share code, notes, and snippets.

import UIKit
// ...
class MainTabController: UITabBarController, UITabBarControllerDelegate {
// ...
private func animateToast() {
if let currentNavigationController = selectedViewController as? UINavigationController,
let _ = currentNavigationController.visibleViewController as? BetDetailsViewController {

Flare Refactoring

  • Method length. Like in Ruby, you want to try and keep to the Single Responsibility Principle, and make sure each method + class does one thing only. Example here: https://gist.github.com/yvettecook/507e40561ef77a6102ac83ea46f5a972 taken from FlareDetailViewController. But as a very very very rough guide, I'd aim for <5 lines per method. Less is awesome.

  • Isolate your dependencies. At the moment, Firebase is everywhere in your app. But, what if Google stop supporting it? It's good practice in general (not just on mobile) to try and isolate your external dependencies, so you're not completely screwed if you need to replace one solution with another. This is maybe more advanced refactoring, but if you can hide Firebase behind a more generic model (like Database.swift) which is a singleton (see this article http://krakendev.io/blog/the-right-way-to-write-a-singleton), you can replace this (from LoginVC): if let user = FIRAuth.auth()?.currentUser { ... } to `if let database.current

// BEFORE
override func viewDidLoad() {
let gesture = UITapGestureRecognizer(target: self, action: #selector(FlareDetailViewController.toggle(_:)))
view.userInteractionEnabled = true
view.addGestureRecognizer(gesture)
self.scrollView.contentSize = CGSize(width:1080, height: 1920)
retrieveFlareImage()
flareTitleLabel.text = flareExport!.title!
flareSubtitleLabel.text = flareExport!.subtitle!
@yvettecook
yvettecook / RxTestsDemo.swift
Created September 13, 2016 09:01
Basic demo of using RxTests.
import XCTest
import RxSwift
import RxTests
@testable import SillyDemos
class CornySorterTest2: XCTestCase {
private var testObserver: TestableObserver<String>!
private var scheduler: TestScheduler!
func testValuesTrue() {
// Given
let testInput = ["", "H", "He", "Hel"].toObservable(scheduler)
raceVM = RaceViewModel(userTyping: testInput, originalText: sampleText)
// When
raceVM?.typingRight
.subscribe(observer)
.addDisposableTo(disposeBag)
class ViewController: UIViewController {
var score = 0
@IBOutlet weak var numberButton: UIButton!
@IBAction func numberButtonTapped(sender: UIButton) {
check("Number")
}
class ViewController: UIViewController {
var score = 0
@IBOutlet weak var numberButton: UIButton!
@IBAction func numberButtonTapped(sender: UIButton) {
let calculator = Calculator()
if calculator.check(score + 1) == "Number" {
incrementScore()
@IBAction func fizzButtonTapped(sender: UIButton) {
let calculator = Calculator()
if calculator.check(score + 1) == "Fizz" {
incrementScore()
}
}
func check(number: Int) -> String {
if isDivisibleByFifteen(number) { return "FizzBuzz" }
else if isDivisibleByThree(number) { return "Fizz" }
else if isDivisibleByFive(number) { return "Buzz" }
else { return "Number" }
}
class Calculator {
func isDivisibleByThree(number: Int) -> Bool {
return number % 3 == 0
}
func isDivisibleByFive(number: Int) -> Bool {
return number % 5 == 0
}