Я бы порекомендовал также избегать одиночных игр здесь. Основная мотивация - сделать вещи проверяемыми. Вот возможный подход.
У вас есть User
что-то вроде этого:
struct User {
let userid: String
let email: String
}
Объявите протокол для управления вашим пользователем. Использование протокола упрощает тестирование, поскольку вы можете создать макет, соответствующий ему.
protocol UserManagerProtocol {
func getSignedInUser() -> User?
func signIn(userid: String, password: String) -> User?
}
Объявите ваш фактический класс, который реализует протокол:
class UserManager: UserManagerProtocol {
fileprivate var signedInUser: User?
func getSignedInUser() -> User? {
return signedInUser
}
func signIn(userid: String, password: String) -> User? {
//call your server to sign in user
// if sign in fails, return nil
// if sign in works, create a User object
signedInUser = User(userid: userid, email: "email retrieved from server")
return signedInUser
}
}
Добавьте ссылку в ваши контроллеры представления, но объявите ее, используя протокол, а не реальный класс. Опять же, это позволяет издеваться.
class HomeVC: UIViewController {
var userManager: UserManagerProtocol?
}
class PostVC: UIViewController {
var userManager: UserManagerProtocol?
}
Наконец, в вашем AppDelegate, когда вы запускаете приложение, создайте один экземпляр вашего UserManager
, сохраните его в AppDelegate и передайте его всем вашим контроллерам представления. В этом примере я явно упустил много вещей, потому что я не знаю, как выглядит ваш AppDelegate.
class AppDelegate: NSObject, UIApplicationDelegate {
var userManager: UserManagerProtocol?
func applicationDidFinishLaunching(_ application: UIApplication) {
userManager = UserManager()
//when setting up your tab bar controllers, pass the userManager instance to each of them
}
}