Объединение необязательных цепочек и ifs - PullRequest
0 голосов
/ 08 октября 2019

Я обнаружил, что могу написать этот код:

func optionalReturn() -> Int? {
    // do sth. and return maybe an Int, otherwise:
    return nil
}

if let x = optionalReturn(), x > 5 {
    print("test exists and is greater then 5")
}

Теперь я стою перед следующей проблемой: я хочу иметь if, который обрабатывает два случая:

  • регистр 1: x не существует, ИЛИ

  • регистр 2: x существует, но больше значения 5

Это не работает:

if x == nil || (let x = optionalReturn(), x > 5) {
    ...
}

Это что-то другое. как это возможно в Swift?

UPDATE

Приведенный выше код был упрощен, чтобы показать мою проблему, но мой случай немного отличается, потому что моя вызываемая функция не 't возвращает необязательный Int, он возвращает необязательный struct:

struct TestStruct {
    var x: Int
    var y: Int
}

func optionalReturn() -> TestStruct? {
    // do sth. and maybe return a TestStruct(....), otherwise:
    return nil
}

let test = optionalReturn()

if test == nil || ...?

UPDATE 2

В моем первом обновлении я допустил ошибку. Благодаря Christik, который упомянул об этом в комментариях, мой код имел ошибку и работал бы без нее. Я принял его ответ как решение, но моя первая идея также была правильной: Swift пропускает другие if-условия, если первое OR-условие верно. Так что этот код работает так же:

...

if test == nil || (test!.x > 5 && test!.y > 6) {
    print("I am here")
}

1 Ответ

1 голос
/ 08 октября 2019

Здесь вы можете использовать оператор объединения nil и задать для x значение больше 5, если его ноль:

if (x ?? 6) > 5 {
    // do your thing
}

Что касается обновления вопроса, вы можете использовать map наопционально для достижения вашей цели:

if x.map({ $0.x > 5 && $0.y > 6 }) ?? true {
    // do your thing
}

map имеет то преимущество, что избегает принудительного развертывания.

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