gpt4 book ai didi

ios - 我怎样才能在一个额外的功能中外包这种重复的代码味道? iOS Swift 函数

转载 作者:搜寻专家 更新时间:2023-11-01 06:54:34 25 4
gpt4 key购买 nike

我尝试重构与 DRY 原则相关的重复工作代码。 (Swift 版本 4)您可以下载工作代码项目 here (它并不大)。问题是我不知道如何正确地专门为这些函数执行此操作,因为它们使用 ViewController 类,我无法管理它来传递它们并实例化它们,而不是在外包函数中.我需要根据 dry 查看改进代码的具体实现,因为我在实现部分失败了,我只知道 dry 原则会很干净,但我不知道如何在实际代码中做到这一点

我有什么:

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)
}

}

最佳答案

我会引入一个Coordinatable 协议(protocol):

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)
}
}

关于ios - 我怎样才能在一个额外的功能中外包这种重复的代码味道? iOS Swift 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54491998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com