将IF LET与Swift中的OR组合

时间:2018-05-24 14:55:11

标签: swift if-statement simplify any

是否有一种优雅的方式来组合一个或运算符的两个if语句。例如,我需要检查字符串"传递"," 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语句用于处理传入的数据,那么将这两个组合起来的最简单方法是什么?

4 个答案:

答案 0 :(得分: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而不是if。

答案 1 :(得分: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",我通常会反对。

答案 2 :(得分: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
    }
}

答案 3 :(得分:-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解包的可选项。