是否有一种优雅的方式来组合一个或运算符的两个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语句用于处理传入的数据,那么将这两个组合起来的最简单方法是什么?
答案 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
解包的可选项。