Вызов функции протокола для viewDidLoad UIViewController, когда ViewController может или не может реализовать протокол - PullRequest
0 голосов
/ 21 января 2019

Я хочу иметь возможность вызывать метод протокола в viewDidLoad, только если текущий UIViewController реализует этот протокол независимо от базового класса, от которого я наследую.Я использую приведенный ниже код Playground, чтобы проиллюстрировать, где я сейчас нахожусь, и он вызвал функцию, но вылетает с ошибкой EXC_BAD_ACCESS (code=1, address=0x0). и ничего более.

import UIKit

protocol AccessibleProtocol where Self: UIViewController {
    func applyAccessibility()
}

class BaseViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        (self as? AccessibleProtocol)?.applyAccessibility()
    }
}

class LoginViewController: BaseViewController {
    var passwordTextField: UITextField!
    override func viewDidLoad() {
        passwordTextField = UITextField()
        super.viewDidLoad()
    }
}

extension LoginViewController: AccessibleProtocol {
    func applyAccessibility() {
        self.passwordTextField.accessibilityLabel = "Enter Password"
    }
}

let loginViewController = LoginViewController()
loginViewController.viewDidLoad()

1 Ответ

0 голосов
/ 21 января 2019

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

import UIKit

protocol AccessibleProtocol where Self: UIViewController {
    func applyAccessibility()
}

extension AccessibleProtocol {
    func applyAccessibility() {}
}

class BaseViewController: UIViewController, AccessibleProtocol {
    override func viewDidLoad() {
        super.viewDidLoad()
        applyAccessibility()
    }
}

class LoginViewController: BaseViewController {
    var passwordTextField: UITextField!
    override func viewDidLoad() {
        passwordTextField = UITextField()
        super.viewDidLoad()
    }
}

extension LoginViewController {
    func applyAccessibility() {
        self.passwordTextField.accessibilityLabel = "Enter Password"
    }
}

let loginViewController = LoginViewController()
loginViewController.viewDidLoad()

Таким образом, вы всегда можете вызвать de func из протокола. И если ты не реализовал это, он ничего не сделает.

...