是否有一种优雅的方式来组合一个或运算符的两个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语句处理传入的数据,那么将这两个结合起来的最简单方法是什么?
如果让一个或一个内部,你不能做一个,因为如果它因为一个条件进入语句,另一个可以是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。
你可能只是内联一切:
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"
,我通常会建议反对。
有一个类似的问题,并希望结合两个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
}
}
很明显,当我回答这个问题并且没有仔细阅读时,我心烦意乱。不,你写了一个带有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
解开的可选项。