将IF LET与Swift中的OR组合

问题描述 投票:2回答:3

是否有一种优雅的方式来组合一个或运算符的两个if语句。例如,我需要检查字符串“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"

如果let语句处理传入的数据,那么将这两个结合起来的最简单方法是什么?

swift if-statement simplify any
3个回答
2
投票

如果让一个或一个内部,你不能做一个,因为如果它因为一个条件进入语句,另一个可以是nil,并且if if让你确保var在语句中不是nil。

我只是检查一下他们是不是并且做了些什么。

即使在此示例中,您也不需要使用if let。 (我用一个来展示如何使用AND运算符,使用OR是不可能的。

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

另外,根据SwiftLint,如果你只是想检查一个变量的值是否为nil,最好使用!= nil而不是if let。


0
投票

你可能只是内联一切:

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
投票

有一个类似的问题,并希望结合两个let try?任务保持代码DRY。有它工作,但需要确保正确的括号:

if let number = try? ((try? Number.parse("1")) ?? Number.parse("2")) {
    print("Yay, a number: \(number)")
} else {
    print("Nope, not a number")
}

// => Prints "Yay, a number: 1"
if let number = try? ((try? Number.parse("a")) ?? Number.parse("2")) {
    print("Yay, a number: \(number)")
} else {
    print("Nope, not a number")
}

// => Prints "Yay, a number: 2"

我为这个例子模拟了以下内容,在实际代码中我使用PhoneNumberKit解析了一个数字。

struct Number {
    static func parse(_ numberString: String) throws -> Int {
        if let result = Int(numberString) {
            return result
        } else {
            throw ParsingError.notANumber
        }
    }

    enum ParsingError: Error {
        case notANumber
    }
}

-1
投票

很明显,当我回答这个问题并且没有仔细阅读时,我心烦意乱。不,你写了一个带有2个可选绑定if let语句的表达式,其中只有一个是真的。

你不能说

如果让x = y让a = b

似乎最干净的方法是使用else:

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

以前的答案没有回答被问到的问题:

是的,您可以组合多个if if语句:

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

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

只有当x和y不是nil(并且z == 2)时,才会执行上面的if块

更好的是,每个后续的if let可选绑定都可以使用您以前的if let解开的可选项。

© www.soinside.com 2019 - 2024. All rights reserved.