Как я могу передать этот двойной запах кода в дополнительной функции?iOS Swift Функции - PullRequest
0 голосов
/ 02 февраля 2019

Я пытаюсь реорганизовать этот дублирующий рабочий код, относящийся к принципу СУХОЙ.(Swift Version 4) Вы можете скачать рабочий код Project здесь (он не большой).Проблема в том, что я не знаю, как правильно сделать это специально для этих функций, потому что они используют ViewController классы, и я не смог справиться с ними, чтобы передать их и создать их экземпляр, чем в аутсорсинговой функции.Мне нужно было бы увидеть конкретную реализацию улучшенного кода в соответствии с сухим, потому что я потерпел неудачу в части реализации, я просто знаю, что сухой принцип будет чистым, но я не знаю, как это сделать в реальном коде

Что у меня есть:

import Foundation
import UIKit

public final class MainCoordinator {

    var navigationController: UINavigationController

    init(navigationController: UINavigationController) {
        self.navigationController = navigationController
        self.navigationController.setNavigationBarHidden(true, animated: false)
    }

func showHome() {
    var vc: HomeViewController
    var i = 0
    for viewController in navigationController.viewControllers {
        if (viewController.isKind(of: HomeViewController.self)) {
            vc = viewController as! HomeViewController
            navigationController.viewControllers.remove(at: i)
            navigationController.pushViewController(vc, animated: true)
            return
        }
        i+=1
    }

    vc = HomeViewController.instantiate()
    vc.coordinator = self
    navigationController.pushViewController(vc, animated: true)
}

func showDetail() {
    var vc: DetailViewController
    var i = 0
    for viewController in navigationController.viewControllers {
        if (viewController.isKind(of: DetailViewController.self)) {
            vc = viewController as! DetailViewController
            navigationController.viewControllers.remove(at: i)
            navigationController.pushViewController(vc, animated: true)
            return
        }
        i+=1
    }

    vc = DetailViewController.instantiate()
    vc.coordinator = self
    navigationController.pushViewController(vc, animated: true)
}

func showMasterDetail() {
    var vc: MasterDetailViewController
    var i = 0
    for viewController in navigationController.viewControllers {
        if (viewController.isKind(of: MasterDetailViewController.self)) {
            vc = viewController as! MasterDetailViewController
            navigationController.viewControllers.remove(at: i)
            navigationController.pushViewController(vc, animated: true)
            return
        }
        i+=1
    }

    vc = MasterDetailViewController.instantiate()
    vc.coordinator = self
    navigationController.pushViewController(vc, animated: true)
}

}

ЧТО-ТО ТАК, ЧТО Я ХОЧУ:

Это пример / псевдокод, потому что он не работает.Вы должны понять, что я имею в виду.Как будет выглядеть реальный код?

import Foundation
import UIKit

public final class MainCoordinator {

//..

func showHome() {
    present(HomeViewController)
}

func showDetail() {
    present(DetailViewController)
}

func showMasterDetail() {
    present(MasterDetailViewController)
}

func present(myClass: Class){

    var vc: myClass
    var i = 0
    for viewController in navigationController.viewControllers {
        if (viewController.isKind(of: myClass.self)) {
            vc = viewController as! myClass
            navigationController.viewControllers.remove(at: i)
            navigationController.pushViewController(vc, animated: true)
            return
        }
        i+=1
    }

    vc = myClass.instantiate()
    vc.coordinator = self
    navigationController.pushViewController(vc, animated: true)
}

}

1 Ответ

0 голосов
/ 02 февраля 2019

Я бы ввел Coordinatable протокол:

protocol Coordinatable: class {
  var coordinator: MainCoordinator? { get set }
}

class HomeViewController: UIViewController, Coordinatable {
  var coordinator: MainCoordinator?
}

class MainCoordinator {
  func showHome() {
    let viewController = HomeViewController() // Or instantiate any other way
    present(viewController)
  }

  func present<T: UIViewController>(_ viewController: T) where T: Coordinatable {
    // Do whatever you want here
    viewController.coordinator = self
    navigationController.pushViewController(viewController, animated: true)
  }
}
...