Выражение по умолчанию оператора switch вызывает предыдущий случай? - PullRequest
0 голосов
/ 30 марта 2020

Всякий раз, когда я использую оператор switch-case - 9 раз из 10 - окончательный случай default почти всегда соответствует случаю над ним.

ie.

// WebView Observers
switch webView {
    case webView:
        webViewURLObserver = webView.observe(\.url, options: .new) { [weak self] webView, change in
            let url = "\(String(describing: change.newValue))"
            self?.urlDidChange(urlString: url) }
    case customizerWebView:
        customizerURLObserver = customizerWebView.observe(\.url, options: .new) { [weak self] webView, change in
            let url = "\(String(describing: change.newValue))"
            self?.customizerURLDidChange(urlString: url) }
    case default:
        webViewURLObserver = webView.observe(\.url, options: .new) { [weak self] webView, change in
        let url = "\(String(describing: change.newValue))"
        self?.urlDidChange(urlString: url) }
    }

Есть ли способ, чтобы случай default просто ссылался на один из уже существующих случаев?

// What I'm trying to accomplish
switch webView {
    case webView:
        [webView Observer Code]
        ...
    case customizerWebView:
        [customizerWebView Observer Code]
        ...
    case default:
        switch.case = webView || switch.case = 0
    }

1 Ответ

3 голосов
/ 30 марта 2020

Возможное решение - использовать падение .

Вместо того, чтобы думать:

В случае «по умолчанию»: сделать что-то из цели case

Подумайте об этом по-другому:

В случае целевого случая выполните «default».

switch webView {
case customizerWebView:
    customizerURLObserver = customizerWebView.observe(\.url, options: .new) { [weak self] webView, change in
        let url = "\(String(describing: change.newValue))"
        self?.customizerURLDidChange(urlString: url) }
case webView:
        fallthrough
case default:
    webViewURLObserver = webView.observe(\.url, options: .new) { [weak self] webView, change in
    let url = "\(String(describing: change.newValue))"
    self?.urlDidChange(urlString: url) }
}

Или, как указано @ xTwiteDx , вы можете удалить строки case webView: fallthrough, если вы не указали указанный код c до fallthrough. Вам решать, как вам удобно с вашим кодом, как явные или нет дела.

...