if 문에서 여러 옵션 풀기
하나의 if 문에서 두 개의 선택 사항을 풀고 싶지만 컴파일러는 암호 상수에서 연산자 뒤에 예상되는 식에 대해 불만을 표시합니다. 이유가 무엇일까요?
if let email = self.emailField?.text && let password = self.passwordField?.text
{
//do smthg
}
Swift에서 완료되었습니다.
좋은 소식. 이제 Swift 1.2 (XCode 6.3 베타, 2/9/15 출시) 에서 여러 옵션을 한 줄로 풀기 지원 합니다.
더 이상 튜플 / 스위치 패턴 매칭이 필요하지 않습니다. 실제로 원래 제안 된 구문과 매우 유사합니다 (경청 해 주셔서 감사합니다, Apple!).
if let email = emailField?.text, password = passwordField?.text {
}
또 다른 좋은 점은 where
"보호 조건"을 추가 할 수도 있다는 것입니다 .
var email: String? = "baz@bar.com"
var name: String? = "foo"
if let n = name, e = email where contains(e, "@") {
println("name and email exist, email has @")
}
참조 : XCode 6.3 베타 릴리스 정보
Swift 3 업데이트 :
if let email = emailField?.text, let password = passwordField?.text {
}
이제 각 변수 앞에 let 키워드 가 와야 합니다.
선택 사항을 튜플에 래핑하고 스위치 를 패턴 일치로 사용하는 것은 어떻습니까?
switch (self.emailField?.text, self.passwordField?.text) {
case let (.Some(email), .Some(password)):
// unwrapped 'email' and 'password' strings available here
default:
break
}
확실히 약간 시끄럽지 만 적어도 where 절 과 함께 사용할 수도 있습니다 .
사용법
if let x = y {
}
같지 않다
if (let x = y) { // this is actually not allowed
}
"if let"은 사실상 두 단어로 된 키워드입니다.
if y != nil {
let x = y!
// rest of if let block
}
Swift 1.2 이전
@James와 마찬가지로 unwrap
함수 도 만들었지 만이 함수 if let
는 클로저를 사용하는 대신 기존 제어 흐름을 사용합니다.
func unwrap<T1, T2>(optional1: T1?, optional2: T2?) -> (T1, T2)? {
switch (optional1, optional2) {
case let (.Some(value1), .Some(value2)):
return (value1, value2)
default:
return nil
}
}
다음과 같이 사용할 수 있습니다.
if let (email, password) = unwrap(self.emailField?.text, self.passwordField?.text)
{
// do something
}
에서 : https://gist.github.com/tomlokhorst/f9a826bf24d16cb5f6a3
더 많은 경우를 처리하려면 (예 : 두 필드 중 하나 가 nil 인 경우) switch
문을 사용하는 것이 좋습니다 .
스위프트 4
if let suggestions = suggestions, let suggestions1 = suggestions1 {
XCTAssert((suggestions.count > suggestions1.count), "TEST CASE FAILED: suggestion is nil. delete sucessful");
}
I can't explain why the above code doesn't work, but this would be good a replacement:
if let email = self.emailField?.text
{
if let password = self.passwordField?.text
{
//do smthg
}
}
Based on @Joel's answer, I've created a helper method.
func unwrap<T, U>(a:T?, b:U?, handler:((T, U) -> ())?) -> Bool {
switch (a, b) {
case let (.Some(a), .Some(b)):
if handler != nil {
handler!(a, b)
}
return true
default:
return false
}
}
// Usage
unwrap(a, b) {
println("\($0), \($1)")
}
참고URL : https://stackoverflow.com/questions/24548999/unwrapping-multiple-optionals-in-if-statement
'Program Tip' 카테고리의 다른 글
UITableView 배경 이미지 (0) | 2020.12.02 |
---|---|
post increment 연산자가 int를 반환하는 메서드에서 작동하지 않는 이유는 무엇입니까? (0) | 2020.12.02 |
Qt 링커 오류 : "vtable에 대한 정의되지 않은 참조" (0) | 2020.12.02 |
CSS에서 최소 글꼴 크기를 설정하는 방법 (0) | 2020.12.02 |
SearchView의 지우기 버튼 클릭을 어떻게 캡처합니까? (0) | 2020.12.02 |