논리적 AND 연산자 &&와 함께 Swift iflet 사용
우리는 우리가 사용할 수 있다는 것을 알고 있습니다.if let
선택적인 영(0)을 확인한 후 랩을 풀 수 있는 간단한 설명입니다.
하지만 논리적 AND 연산자를 사용하여 다른 표현식과 결합하고 싶습니다.&&
.
예를 들어, 여기서는 옵션 체인을 사용하여 rootViewController를 압축 해제하고 선택적으로 BarController 탭으로 다운캐스트합니다.하지만 중첩된 if 문을 사용하는 것보다, 저는 그것들을 결합하고 싶습니다.
if let tabBarController = window!.rootViewController as? UITabBarController {
if tabBarController.viewControllers.count > 0 {
println("do stuff")
}
}
결합된 기부:
if let tabBarController = window!.rootViewController as? UITabBarController &&
tabBarController.viewControllers.count > 0 {
println("do stuff")
}
}
위에 확인되지 않은 식별자 'tabBarController'의 컴파일 오류가 표시됩니다.
단순화:
if let tabBarController = window!.rootViewController as? UITabBarController && true {
println("do stuff")
}
이것은 컴파일 오류를 제공합니다. 조건부 바인딩의 바인딩 값은 선택 유형이어야 합니다.다양한 구문 변형을 시도한 결과, 각각 다른 컴파일러 오류가 발생합니다.저는 아직 순서와 괄호의 승리 조합을 찾지 못했습니다.
그래서 문제는, 그것이 가능한가, 그렇다면 올바른 구문은 무엇인가 하는 것입니다.
참고로 이 작업은 다음과 같이 수행합니다.if
a가 아닌 진술switch
진술 또는 삼차 진술?
교환입니다.
Swift 1.2부터는 이것이 가능합니다.Swift 1.2 및 Xcode 6.3 베타 릴리스 노트에는 다음이 명시되어 있습니다.
iflet을 사용한 더 강력한 옵션 래핑 해제 — iflet 구성은 이제 한 번에 여러 옵션의 래핑을 해제할 수 있을 뿐만 아니라 중간 부울 조건도 포함할 수 있습니다.이렇게 하면 불필요한 중첩 없이 조건부 제어 흐름을 표현할 수 있습니다.
위의 문장을 사용하면 구문은 다음과 같습니다.
if let tabBarController = window!.rootViewController as? UITabBarController where tabBarController.viewControllers.count > 0 {
println("do stuff")
}
이는 다음을 사용합니다.where
절
또 다른 예로, 이번 캐스팅이 있습니다.AnyObject
로.Int
옵션의 래핑을 해제하고 래핑 해제된 옵션이 조건을 충족하는지 확인합니다.
if let w = width as? Int where w < 500
{
println("success!")
}
현재 Swift 3을 사용하는 사용자의 경우 "where"가 쉼표로 대체되었습니다.따라서 그에 상응하는 것은 다음과 같습니다.
if let w = width as? Int, w < 500
{
println("success!")
}
Swift 3에서 Max MacLeod의 예는 다음과 같습니다.
if let tabBarController = window!.rootViewController as? UITabBarController, tabBarController.viewControllers.count > 0 {
println("do stuff")
}
그where
로 대체됨,
맥스의 대답은 정확하고 이것을 하는 한 가지 방법입니다.그러나 이러한 방식으로 작성할 때는 다음과 같습니다.
if let a = someOptional where someBool { }
그someOptional
식이 먼저 확인됩니다.실패할 경우에는someBool
식은 평가되지 않습니다(예상대로 단락 평가).
이를 반대로 작성하려는 경우 다음과 같이 수행할 수 있습니다.
if someBool, let a = someOptional { }
이 경우someBool
먼저 평가되고, 그것이 참으로 평가될 때만.someOptional
식을 계산했습니다.
스위프트 4, 제가 쓸게요
let i = navigationController?.viewControllers.index(of: self)
if let index = i, index > 0, let parent = navigationController?.viewControllers[index-1] {
// access parent
}
불가능합니다.
IF 문 문법
if-statement → if "if-condition" code-block" else-"opt"
if-condition → expression 명령 | 선언 명령
else-message → else("코드 블록") | else("if-statement")
if 문의 모든 조건 값은 BooleanType 프로토콜을 준수하는 유형이어야 합니다.조건은 선택적 바인딩에서 설명한 대로 선택적 바인딩 선언일 수도 있습니다.
if-condition은 식() 또는 선언()이어야 합니다.당신은 표현과 선언을 둘 다 가질 수 없습니다.
let foo = bar
선언이며, 그것은 적합한 값으로 평가되지 않습니다.BooleanType
변상/수를선니다를 합니다.foo
.
당신의 원래 솔루션은 충분히 좋습니다. 조건을 결합하는 것보다 훨씬 더 읽기 쉽습니다.
if let tabBarController = window!.rootViewController as? UITabBarController ,
tabBarController.viewControllers?.count ?? 0 > 0 {
println("do stuff")
}
}
언급URL : https://stackoverflow.com/questions/25202770/using-the-swift-if-let-with-logical-and-operator
'code' 카테고리의 다른 글
속성과 속성의 차이점은 무엇입니까? (0) | 2023.08.11 |
---|---|
phpmyadmin sql 명령에서 작동하는 동안 이벤트 구문 오류가 발생했습니다. (0) | 2023.08.11 |
Null 포인터Kotlin 조각에서 보기에 액세스하려고 할 때 예외 발생 (0) | 2023.08.06 |
하위 문자열 가져오기 - 특정 문자 앞의 모든 항목 (0) | 2023.08.06 |
두 위젯/레이아웃 사이에 새 "플로팅 수행 단추"를 추가하려면 어떻게 해야 합니까? (0) | 2023.08.06 |