논리 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 { }
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-clauseopt
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
'IT story' 카테고리의 다른 글
Rails 콘솔 / irb 출력을 억제하는 방법 (0) | 2020.09.17 |
---|---|
Postgresql이 수퍼 유저로 "createdb"를 사용하여 db를 생성하지 않지만 오류를 출력하지 않음 (0) | 2020.09.17 |
지원 라이브러리 v21로 업그레이드 한 후 PreferenceActivity에 ActionBar가 없음 (0) | 2020.09.17 |
문자열에 공백이 있는지 확인 (0) | 2020.09.17 |
“Content-Provider”와“SQLite Database”의 정확한 차이점 (0) | 2020.09.17 |