[Swift] - first문

longlivedrgn·2023년 1월 11일
0

swift문법

목록 보기
31/36
post-thumbnail

💥 배열 속 주어진 조건을 만족하는 요소 찾기

first문

  • 배열 속 하나하나를 클로져 안에 parameter로 넣어주어 클로져 안에 있는 body에서 첫번째로 true를 던질 때 그 요소를 가져온다.

    • return을 생략하는 방법
    • return을 생략하지 않는 방법
  • 즉, closure 안에서 return true가 나올 때까지 계속 반복하고, 안나오면 nil을 내뱉는다.

  • closure 안에서 false가 나오면 거기서 멈추고 다음 요소로 넘어간다!

  • 대체로 아래와 같이 return을 생략하는 방식으로 많이 사용한다.

let numbers = [3, 7, 4, -2, 9, -6, 10, 1]

let 넘버 = numbers.first { num in
    num < 0
}

print(넘버) // Optional(-2)
  • 그러나, 아래와 같이 return생략하지 않는 방법도 존재한다.
let 넘버 = numbers.first { num in
    return num < 0
}
print(넘버) // Optional(-2)
  • 아래의 코드에서 guard문을 통과하지 못하면 return false로 넘어가게 되므로 다음 요소를 체크하러 바로 넘어간다.
let numbers = [3, 7, 4, -2, 9, -6, 10, 1]

let 넘버 = numbers.first { num in
    guard num > 0 else {
        return false
    }
    print(num)
    return num < 0
}

print(넘버) // 3 7 4 9 10 1 nil
  • 그러면, 아래의 실제 코드를 분석해보자.
    • 먼저, 타입 캐스팅이 불가능하면 return false로 바로 다음 stockLabel로 넘어가게 되며, guard문을 통과하였다고 하여도, fruitLabel.fruit != fruit이라면, return false이므로 다음 stockLabel로 넘어가게된다.
    • 최종적으로 return fruitLabel.fruit == fruit ⇒ return true 를 만족하는 순간 더 이상의 stockLabel 탐색은 종료가되고 first문은 종료가된다.
    • 즉, return false라고 first문 자체가 종료되는 것이 아니라, 다음 stockLabel로 넘어가게되는 것이다.
private func stockLabel(of fruit: Fruit) -> UILabel? {
        return fruitStockLabels.first { stockLabel in
            guard let fruitLabel = stockLabel as? FruitLabelProtocol else {
                return false
            }
            return fruitLabel.fruit == fruit
        }
    }

0개의 댓글