수색…


통사론

  • 상수에 대한 연속 {명령문}
  • 조건 상 {상수}
  • for 연속 변수 {statements}에 대한 var 변수
  • for _ in sequence {statements}
  • for case constant {statements}를 연속적으로 보자.
  • for case for sequence in constant where {statements}
  • case var 변수를 연속 {statements}
  • 조건 {명령문}
  • 조건이있을 때 repeat {statements}
  • sequence.forEach (body : (Element) throws -> void)

For-in 루프

for-in 루프를 사용하면 모든 시퀀스를 반복 할 수 있습니다.

범위 반복

반 개방 및 폐쇄 범위에서 반복 할 수 있습니다.

for i in 0..<3 {
    print(i)
}

for i in 0...2 {
    print(i)
}

// Both print:
// 0
// 1
// 2

배열이나 세트 반복

let names = ["James", "Emily", "Miles"]

for name in names {
   print(name)
}

// James
// Emily
// Miles
2.1 2.2

배열의 각 요소에 대한 인덱스가 필요한 경우 SequenceType 에서 enumerate() 메서드를 사용할 수 있습니다.

for (index, name) in names.enumerate() {
   print("The index of \(name) is \(index).")
}

// The index of James is 0.
// The index of Emily is 1.
// The index of Miles is 2.

enumerate() 는 0부터 시작하는 연속 된 Int 갖는 요소 쌍을 포함하는 지연 시퀀스를 반환합니다. 따라서 배열의 경우 이러한 숫자는 각 요소의 지정된 인덱스와 일치하지만 다른 유형의 컬렉션에서는 그렇지 않을 수 있습니다.

3.0

Swift 3에서 enumerate() 이름이 enumerated() 로 변경되었습니다.

for (index, name) in names.enumerated() {
   print("The index of \(name) is \(index).")
}

사전 반복

let ages = ["James": 29, "Emily": 24]

for (name, age) in ages {
    print(name, "is", age, "years old.")
}

// Emily is 24 years old.
// James is 29 years old.

역순으로 반복

2.1 2.2

SequenceType 에서 reverse() 메서드를 사용하면 모든 시퀀스를 역순으로 반복 할 수 있습니다.

for i in (0..<3).reverse() {
    print(i)
}

for i in (0...2).reverse() {
    print(i)
}

// Both print:
// 2
// 1
// 0

let names = ["James", "Emily", "Miles"]

for name in names.reverse() {
    print(name)
}

// Miles
// Emily
// James
3.0

스위프트 3에서 reverse()reversed() 로 이름이 변경되었습니다.

for i in (0..<3).reversed() {
    print(i)
}

커스텀 보폭으로 범위를 반복

2.1 2.2

Strideable 에서 stride(_:_:) 메소드를 사용하면 사용자 정의 스트라이드를 사용하여 범위를 반복 할 수 있습니다.

for i in 4.stride(to: 0, by: -2) {
    print(i)
}

// 4
// 2

for i in 4.stride(through: 0, by: -2) {
    print(i)
}

// 4
// 2
// 0
1.2 3.0

Swift 3에서는 Stridablestride(_:_:) 메소드가 전역 stride(_:_:_:) 함수로 대체되었습니다.

for i in stride(from: 4, to: 0, by: -2) {
    print(i)
}

for i in stride(from: 4, through: 0, by: -2) {
    print(i)
}

반복주기 루프

while 루프와 마찬가지로 컨트롤 문만 루프 이후에 평가됩니다. 따라서 루프는 항상 한 번 이상 실행됩니다.

var i: Int = 0

repeat {
   print(i)
   i += 1
} while i < 3

// 0
// 1
// 2

while 루프

while 루프는 조건이 true 인 동안 실행됩니다.

var count = 1

while count < 10 {
    print("This is the \(count) run of the loop")
    count += 1
}

각 블록에 대한 시퀀스 유형

SequenceType 프로토콜을 준수하는 유형은 클로저 내의 요소를 반복 할 수 있습니다.

collection.forEach { print($0) }

명명 된 매개 변수를 사용하여 동일한 작업을 수행 할 수도 있습니다.

collection.forEach { item in
    print(item)
}

* 참고 : 제어 흐름 명령문 (중단 또는 계속)은이 블록에서 사용될 수 없습니다. return을 호출 할 수 있고 호출 된 경우 현재 반복에 대한 블록을 즉시 반환합니다 (계속과 마찬가지로). 다음 반복이 실행됩니다.

let arr = [1,2,3,4]

arr.forEach {
    
    // blocks for 3 and 4 will still be called
    if $0 == 2 {
        return
    }
}

필터링 기능이있는 For-in 루프

  1. where

where 절을 추가하면 반복을 주어진 조건을 만족하는 것으로 제한 할 수 있습니다.

for i in 0..<5 where i % 2 == 0 {
    print(i)
}

// 0
// 2
// 4


let names = ["James", "Emily", "Miles"]

for name in names where name.characters.contains("s") {
    print(name)
}

// James
// Miles
  1. case

패턴과 일치하는 값을 통해서만 반복해야하는 경우에 유용합니다.

let points = [(5, 0), (31, 0), (5, 31)]
for case (_, 0) in points {
    print("point on x-axis")
}

//point on x-axis
//point on x-axis

또한 선택적 값을 필터링하고 필요하면 ? 상수 바인딩 후 표시 :

let optionalNumbers = [31, 5, nil]
for case let number? in optionalNumbers {
    print(number)
}

//31    
//5

루프 깨기

루프는 조건이 true 인 동안 실행되지만 break 키워드를 사용하여 루프를 수동으로 중지 할 수 있습니다. 예 :

var peopleArray = ["John", "Nicole", "Thomas", "Richard", "Brian", "Novak", "Vick", "Amanda", "Sonya"]
var positionOfNovak = 0

for person in peopleArray {
    if person == "Novak" { break }
    positionOfNovak += 1
}

print("Novak is the element located on position [\(positionOfNovak)] in peopleArray.")
//prints out: Novak is the element located on position 5 in peopleArray. (which is true)


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow