Объедините IF LET с ИЛИ в Swift - PullRequest
0 голосов
/ 24 мая 2018

Есть ли изящный способ объединить два оператора let с помощью оператора или.Например, мне нужно проверить строки «pass», «true» или целое число 1. Следующая функция делает именно это ...

func test(content: Any) -> String {
    if let stringValue = (content as? String)?.lowercased(),
        ["pass", "true"].contains(stringValue) {
        return "You Passed"
    }
    if let numValue = (content as? Int),
        1 == numValue {
        return "YOU PASSED"
    }
    return "You Failed"
}

test(content: "Pass") //"You Passed"
test(content: 1) //"YOU PASSED"

Какой самый простой способ объединитьэти два оператора if позволяют обрабатывать передаваемые данные?

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

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

Я бы просто проверил, не равны ли они нулю, и что-то сделал.

Даже в этом примере вам не нужно использовать if let.(Я использую один, чтобы показать, как использовать с оператором AND, с OR это невозможно.

if let stringValue = (content as? String)?.lowercased(), (["pass", "true"].contains(stringValue) || 1 == (numValue ?? 0)) {
        return "You Passed"
    }

Кроме того, если вы просто хотите проверить, является ли значение переменной нулевым или нет, онолучше использовать! = nil вместо if, согласно SwiftLint.

0 голосов
/ 24 мая 2018

Вы, вероятно, можете просто вставить все:

func test(content: Any) -> String {
    if ["pass", "true"].contains((content as? String)?.lowercased())
        || (content as? Int) == 1 {
        return "You Passed"
    }
    return "You Failed"
}

, но в целом я бы посоветовал разделить такие вещи на несколько методов, один для проверки значения, а второй для перевода его в String:

func test(content: Any) -> Bool {
   return ["pass", "true"].contains((content as? String)?.lowercased())
       || (content as? Int) == 1
}

func testToString(content: Any) -> String {
   return test(content: content) ? "You passed" : "You failed"
}

Вы также можете сначала преобразовать все значения в String и проверить, что:

func test(content: Any) -> Bool {
    let stringValue = String(describing: content).lowercased()

    return ["1", "pass", "true"].contains(stringValue)
}

Однако это добавит ложных срабатываний, потому что вернет true дажедля "1" строки, и я бы вообще советовал против этого.

0 голосов
/ 24 мая 2018

Очевидно, что я отвлекся, когда ответил на этот вопрос, и не прочитал его достаточно внимательно.Нет, вы пишете выражение с 2 необязательными связывающими операторами if let, где только один из них будет истинным.

вы не можете сказать

, если let x = y let a = b

кажется, что самый чистый способ сделать это с помощью else:

if let x = y { code }
else if let a = b { other code } 

Предыдущий ответ, который не ответил на заданный вопрос:

Да, вы можете комбинироватькратные операторы if let:

var x: Int? = 1
var y: String? = ""
var z = 2

if let x = x,
  let y = y,
  z == 2 {
    //do stuff
}

Приведенный выше блок if будет выполняться, только если x и y не равны nil (и z == 2)

Еще лучше, каждый последующий if letнеобязательная привязка может использовать необязательную, развернутую с предыдущей if let.

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