Swift Switch получает доступ к вложенным свойствам внутри case - PullRequest
0 голосов
/ 26 июня 2019

После этого фрагмента кода.Я пытаюсь понять, возможно ли получить доступ к вложенным свойствам объекта в операторе Switch без необходимости разворачивать свойства внутри самого 'case' (избегать ненужных замыканий).Вот глупо-простой пример.конечно, компиляторы не работают с (фрагмент кода ниже изображения):

enter image description here

class Z {
    var common = 4
}

class A: Z {

}

class B: Z {

}

class C: Z {
    var specific: String? = "%"
}


let unknown = Z()

switch (unknown, unknown.common) {
case (let a as A, 4):
    break

case (let b as B, 4):
    break

case (let c as C, 4), let nonNilSpecific as? String:
    // use nonNilSpecific WITHOUT unwrap it within the case clousre
    break
default: break
}

1 Ответ

1 голос
/ 26 июня 2019

Когда вы используете несколько шаблонов в одном случае switch, они должны связывать все одинаковые переменные.

Swift видит эту строку:

case (let c as C, 4), let nonNilSpecific as? String:

и думает, что выВы пытаетесь найти совпадение либо (let c as C, 4), либо let nonNilSpecific as? String.Эти два варианта связывают разные переменные, поэтому в теле дела невозможно узнать, какие переменные были связаны.

Возможно, вы хотели что-то вроде этого:

switch (unknown, unknown.common) {
case (let a as A, 4):
    break

case (let b as B, 4):
    break

case (let c as C, 4) where c.specific != nil:
    // force unwrap safe here, no closure needed
    let nonNilSpecific = c.specific!

default: break
}

Используйте if:

let tuple = (unknown, unknown.common)
if case (let a as A, 4) = tuple {
    // use a
} else if case (let b as B, 4) = tuple {
    // use b
} else if case (let c as C, 4) = tuple, let nonNilSpecific = c.specific {
    // use c and nonNilSpecific
} else {
    // default case
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...