Program Tip

if 문에서 여러 옵션 풀기

programtip 2020. 12. 2. 21:44
반응형

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

반응형