[swift] 논리 AND 연산자 &&와 함께 Swift if let 사용
if let
선택적 nil을 확인한 다음 언 래핑 하기 위해 구문을 속기로 사용할 수 있다는 것을 알고 있습니다 .
그러나 논리 AND 연산자를 사용하여 다른 표현식과 결합하고 싶습니다 &&
.
예를 들어, 여기에서는 선택적으로 연결하여 내 rootViewController를 tabBarController로 언 래핑하고 선택적으로 다운 캐스트합니다. 그러나 중첩 된 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")
}
이렇게하면 컴파일 오류가 발생 합니다. 조건부 바인딩의 Bound 값은 Optional 유형이어야합니다 . 다양한 구문 변형을 시도한 결과 각각 다른 컴파일러 오류가 발생합니다. 나는 아직 순서와 괄호의 조합을 찾지 못했습니다.
따라서 문제는 가능합니까? 그렇다면 올바른 구문은 무엇입니까?
내가 함께이 작업을 수행 할 수 있습니다 if
진술 하지switch
문 또는 삼항 ?
연산자.
답변
Swift 1.2 부터는 이제 가능합니다 . 스위프트 1.2 엑스 코드 6.3 베타 릴리스 노트 상태 :
if let을 사용한보다 강력한 선택적 언 래핑 — if let 구조는 이제 여러 옵션을 한 번에 언 래핑 할 수있을뿐만 아니라 중간에 부울 조건을 포함 할 수 있습니다. 이를 통해 불필요한 중첩없이 조건부 제어 흐름을 표현할 수 있습니다.
위의 명령문을 사용하면 구문은 다음과 같습니다.
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!")
}
답변
에서 스위프트 3 최대 MacLeod 씨의 예는 다음과 같습니다
if let tabBarController = window!.rootViewController as? UITabBarController, tabBarController.viewControllers.count > 0 {
println("do stuff")
}
where
로 대체되었다,
답변
Max의 대답은 정확하며이를 수행하는 한 가지 방법입니다. 다음과 같이 작성하면 다음 사항에 유의하십시오.
if let a = someOptional where someBool { }
someOptional
표현 먼저 해결 될 것입니다. 실패하면 someBool
표현식이 평가되지 않습니다 (예상대로 단락 평가).
이것을 다른 방법으로 작성하려면 다음과 같이 할 수 있습니다.
if someBool, let a = someOptional { }
이 경우 someBool
먼저 평가되고 true로 평가되는 경우에만 someOptional
식이 평가됩니다.
답변
Swift 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 -condition code-block else-clauseo
if 조건 → 표현식 | 선언
else 절 → else 코드 블록 | else if 문
if 문의 조건 값은 BooleanType 프로토콜을 따르는 유형을 가져야합니다. 조건은 선택적 바인딩에 설명 된대로 선택적 바인딩 선언 일 수도 있습니다.
if-condition은 표현식 또는 선언 이어야합니다 . 표현과 선언을 모두 가질 수는 없습니다.
let foo = bar
은 선언이며을 준수하는 값으로 평가되지 않습니다 BooleanType
. 상수 / 변수를 선언합니다 foo
.
원래 솔루션은 충분하며 조건을 결합하는 것보다 훨씬 더 읽기 쉽습니다.
답변
나는 당신의 원래 제안이 너무 나쁘지 않다고 생각합니다. (메시 어) 대안은 다음과 같습니다.
if ((window!.rootViewController as? UITabBarController)?.viewControllers.count ?? 0) > 0 {
println("do stuff")
}