IT story

논리 AND 연산자 &&와 함께 Swift if let 사용

hot-time 2020. 9. 17. 18:59
반응형

논리 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절을 사용합니다 .

또 다른 예는, 이번에는 캐스팅 AnyObjectInt옵션을 풀기, 그리고 풀어 옵션이 조건을 충족하는지 확인 :

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 { }

The someOptional expression will be resolved first. If it fails then the someBool expression will not be evaluated (short-circuit evaluation, as you'd expect).

If you want to write this the other way around it can be done like so:

if someBool, let a = someOptional { }

In this case someBool is evaluated first, and only if it evaluates to true is the someOptional expression evaluated.


It is not possible.

From Swift grammar

GRAMMAR OF AN IF STATEMENT

if-statement → if ­if-condition­ code-block­ else-clause­opt­

if-condition → expression­ | declaration­

else-clause → else­ code-block­ | else­ if-statement­

The value of any condition in an if statement must have a type that conforms to the BooleanType protocol. The condition can also be an optional binding declaration, as discussed in Optional Binding

if-condition must be expression­ or declaration­. You can't have both expression and declaration.

let foo = bar is a declaration, it doesn't evaluate to a value that conforms to BooleanType. It declares a constant/variable foo.

Your original solution is good enough, it is much more readable then combining the conditions.


Swift 4, I will use,

let i = navigationController?.viewControllers.index(of: self)
if let index = i, index > 0, let parent = navigationController?.viewControllers[index-1] {
    // access parent
}

I think your original proposition is not too bad. A (messier) alternative would be:

if ((window!.rootViewController as? UITabBarController)?.viewControllers.count ?? 0) > 0 {
    println("do stuff")
}

참고URL : https://stackoverflow.com/questions/25202770/using-the-swift-if-let-with-logical-and-operator

반응형