Я делаю приложение для iOS со Swift, которое имеет разные состояния для большинства контроллеров представления, составляющих приложение. Несколько «состояний», от которых зависят контроллеры представлений, связаны с тем, вошел ли пользователь в систему или нет, или адрес зарегистрирован, найден или отсутствует, и т. Д. В настоящее время данные передаются контроллерам представлений в prepare(for:sender)
методы.
Ниже приведена структура моего приложения, и существует еще около десятка контроллеров представления с аналогичной структурой.
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
}
Я не могу найти оригинальную запись, которую я нашел, когда впервые столкнулся с «как я могу передавать данные между контроллерами представления» около года назад, но это, вероятно, один из них: Передача данных между контроллерами представления (который нигде не упоминает термин внедрение зависимости).
Затем я услышал этот термин внедрение зависимостей около месяца назад, и этот причудливый термин, казалось, соответствовал моей ситуации с обработкой класса (HomeViewController
и OtherViewController
), который должен иметь дело с данными, которые могут иметь состояния (struct App
).
Чтобы проверить этот подход к бросанию экземпляра app
в segue, я провел несколько ночей исследования.
Но теперь я перегружен слишком большим количеством информации о: нескольких методологиях внедрения зависимостей , модульном тестировании в быстром режиме через DI , нескольких инфраструктурах DI здесь , здесь , здесь , и здесь , рамки модульного тестирования здесь , здесь и (теперь я не могу добавить больше ссылок из-за отсутствия репутации ..) и целая куча сообщений среднего / блога / SO.
Вопрос в следующем: 1. Я делаю так называемое внедрение зависимостей здесь, и это «правильный путь»? 2. Могу ли я продолжить юнит / Тестирование пользовательского интерфейса с помощью этого подхода? 3. Если то, что я делаю, является законным внедрением зависимости, то зачем нужен каркас внедрения зависимости?
Фреймворки внедрения зависимостей выглядят ненужными, загадочные , (и страшно), по крайней мере, для меня просто попытка написать поддерживаемое приложение, которое следует принципам SOLID.
Я устал от абстрактных концепций или, казалось бы, не связанных между собой примеров с моей ситуацией, поэтому я был бы рад, если бы кто-нибудь помог мне с этими концепциями и проектными решениями, включая необходимость в фреймворках.