【发布时间】:2019-07-05 19:47:58
【问题描述】:
我正在使用 Swift 制作一个 iOS 应用程序,该应用程序对于组成该应用程序的大多数视图控制器具有不同的状态。视图控制器依赖的少数“状态”是用户是否登录,或者地址是否已注册、搜索或丢失等。目前,数据在@中提供给视图控制器987654330@ 方法。
以下是我的应用程序的结构,还有大约十几个具有类似结构的视图控制器。
App.swift
struct App {
enum LoginState {
case unregistered
case registered(User) // User defined elsewhere
}
enum OtherState {
case stateOne
case stateTwo(AssociatedType)
case stateThree(OtherAssociatedType)
}
// Default states
var loginState: LoginState = .unregistered
var otherState: OtherState = .stateOne
}
HomeViewController.swift
class HomeViewController: UIViewController {
var app: App!
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
super.prepare(for: segue, sender: sender)
switch segue.identifier {
case "Other View Controller Segue":
let otherVC = segue.destination as! OtherViewController
otherVC.app = app
default:
break
}
}
AppDelegate.swift
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let storybard = UIStoryboard(name: "Main", bundle: nil)
let mainNavController = storyboard.instantiateViewController(withIdentifier: "Main Navigation Controller") as! UINavigationController
let homeViewController = mainNavController.topViewController as! HomeViewController
window?.rootViewController = mainNavController
// 'injecting' app to the homeViewController
homeViewController.app = App()
return true
}
大约一年前第一次遇到“如何在视图控制器之间传递数据”时,我找不到原始帖子,但这可能是其中之一:Passing Data between View Controllers(其中没有提到任何地方的术语依赖注入)。
然后我大约一个月前听到了依赖注入这个术语,这个花哨的术语似乎很适合我处理需要处理数据的类(HomeViewController 和OtherViewController)州 (struct App)。
为了验证这种在 segue 中抛出 app 实例的方法,我做了几个晚上的研究。
但是现在我已经被太多的信息淹没了:several dependency injection methodologies、unit testing in swift via DI、一些 DI 框架here、here、here、and here、单元测试框架here、here , 和(现在由于缺乏声誉,我无法添加更多链接..),以及一大堆媒体/博客/SO 帖子。
问题是:1. 我是不是在这里做所谓的依赖注入,这是“正确的方式”吗? 2. 我可以使用这种方法进行单元/UI 测试? 3. 如果我正在做的是合法的依赖注入,为什么需要依赖注入框架?
依赖注入框架看起来没有必要,神秘,(而且很吓人),至少对我来说只是试图编写一个遵循 SOLID 原则的可维护应用程序。 我厌倦了抽象概念或与我的情况看似无关的示例,所以如果有人帮助我解决这些概念和设计决策,包括对框架的需求,我会很高兴。
【问题讨论】:
标签: ios swift dependency-injection