옵셔널바인딩과 반복문을 동시에 사용하는 방법이 있다. 바로 while-let 이다.
while-let은 옵셔널 바인딩에서 사용한 if-let과 반복문이 합쳐진 형태라고 보면 된다.
var numbers: [Int?] = [1, 2, nil, 4, nil, 6]
while let number = numbers.popLast() {
print("Number: \(number)")
}
Number: Optional(6)
Number: nil
Number: Optional(4)
Number: nil
Number: Optional(2)
Number: Optional(1)
기능으로 놓고 보면 ForEach문과 if-let이 합쳐진 기능에 가깝다.
var numberStrings = ["123", "456", "789", "101112", "131415", "banana"]
var index = 0
while let first = Int(numberStrings[index]),
let second = Int(numberStrings[index + 1]),
index < numberStrings.count - 1 {
print("첫 번째: \(first), 두 번째: \(second)")
index += 2
}
첫 번째: 123, 두 번째: 456
첫 번째: 789, 두 번째: 101112
위 코드는 배열의 원소를 2개씩 묶어서 출력하는 코드이다.
옵셔널 바인딩으로 인해 int로 변환 불가능해서 nil을 반환하는 원소의 쌍인 경우에는 출력이 안된다.
그리고 let의 바인딩 뒤에 붙은 조건을 보면 알수 있듯 while-let에는 while처럼 조건을 적용하는것이 가능하다.
var numbers: [Int?] = [1, 2, nil, 4, nil, 6]
var index = 0
while let number = numbers[index], number < 4 {
print("값: \(number)")
index += 1
}
값: 1
값: 2
이처럼 바인딩의 뒤에 ,로 구분해서 조건을 입력해 준다.
무조건 바인딩 구문 뒤에 와야된다는 점을 유의하자.
var inputs: [String] = []
while let command = readLine(), !command.isEmpty {
inputs.append(command)
}
print(inputs)
백준같은 문제들을 풀다보면 문자열을 여러개 입력받아야 하는 경우가 자주 생긴다.
그럴때 사용하면 유용한 코드인데 readLine()으로 문자열을 입력받되 데이터가 빈 경우에서의 줄바꿈 (=엔터) 가 오면 입력 while-let을 중단하는 구조이다.
옵셔널 바인딩과 반복문이 합쳐진 while-let이 있다.
while-let의 기능은 Foreach와 옵셔널 바인딩이 합쳐진 형태에 가깝다.
동시에 여러개의 바인딩을 하는것도 가능하고, while처럼 조건을 하나 거는것도 가능하다.
위 특징을 이용해서 여러개의 문자열을 입력받아야 하는 경우에도 활용 할 수 있다.