Написание класса в качестве вспомогательного сервиса и вызов его из другого класса - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь понять, как подойти к этому в Swift.

Скажем, например, у меня есть следующий UIViewController

class ViewController: UIViewController {

    let logoutButton: UIButton = {
        let button = UIButton()
        button.setTitle("Logout", for: .normal)
        button.setTitleColor(UIColor.black, for: .normal)
        button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 24)
        button.addTarget(self, action: #selector(onPressLogout), for: .touchUpInside)
        button.translatesAutoresizingMaskIntoConstraints = false
        return button
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        navigationItem.title = "Logged in"

        view.addSubview(logoutButton)
        NSLayoutConstraint.activate([
            logoutButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            logoutButton.centerYAnchor.constraint(equalTo: view.centerYAnchor)
        ])
    }

    @objc fileprivate func onPressLogout() {
        AuthService.logOut()
    }
}

и AuthService

final class AuthService {
    static func logOut() -> Void {
        print("Logout Pressed")
    }
}

То, что я хотел бы сделать, это позвонить logOut на мой AuthService, когда нажата onPressLogout.

Я пытаюсь понять, как мне получить доступ к logOut в правильном и лучшем виде.Возможный путь.

Например, как у меня сейчас?Статический метод в классе?

Стоит ли вместо этого создать его экземпляр, например

lazy var auth = AuthService()

, а затем вызвать выход из системы через auth.logOut() без ключевого слова static?

Я не совсем понимаю, каков наилучший подход к созданию этих «вспомогательных» классов.

Ответы [ 3 ]

0 голосов
/ 01 декабря 2018

Возможно, я бы подошел к этому, используя singleton .

struct AuthService {

    static let shared: AuthService = {
        return AuthService()
    }()

    func logOut() -> Void {
        print("Logout Pressed")
    }
}

Это позволит вам вызывать ваш метод как AuthService.shared.logOut()

0 голосов
/ 01 декабря 2018

Использование синглтона - обычная практика.

Для удобства тестирования я бы порекомендовал внедрить ваш AuthService в качестве зависимости.Сначала я создал бы протокол:

protocol AuthServiceProtocol {
    func logOut()
}

Затем я бы заставил свою службу соответствовать этому протоколу.(Примечание: этот класс может быть настроен как одноэлементный, это действительно не имеет значения для моей цели здесь, а именно для демонстрации внедрения зависимости.)

class AuthService: AuthServiceProtocol {
    func logOut() {
        print("Logout Pressed")
    }
}

Я бы добавил переменную уровня класса вКонтроллер моего представления:

class ViewController: UIViewController {
    var authService: AuthServiceProtocol?

    //existing code...
}

Необходимо изменить функцию выхода из системы следующим образом:

@objc fileprivate func onPressLogout() {
    authService?.logOut()
}

После создания контроллера представления я передам в него службу:

let vc = ViewController()
vc.authService = AuthService()

Вот и все.Я могу проверить это на игровой площадке следующим образом:

//TEST by forcing view to load and sending fake button touch event
let _ = vc.view
vc.logoutButton.sendActions(for: .touchUpInside)

//prints... "Logout Pressed"

Теперь я могу написать реальный модульный тест, который проходит в фиктивном сервисе, который не имеет зависимостей.Это позволяет мне более надежно тестировать мой контроллер вида.

0 голосов
/ 01 декабря 2018

Я не знаю точного использования AuthService, но вы можете записать его в шаблон Singleton .

Это гарантирует, что инициируется только один экземпляр класса.примеры одноэлементных паттернов: URLSession.shared, UserDefaults.standard

Таким образом, вы сможете получить к нему доступ таким образом, как AuthService.shared.logout() или AuthService.shared.isUserLoggedIn

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...