Swift. Цикл for

From AsIsWiki
Revision as of 15:58, 14 April 2022 by Alex (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Назад · Оглавление · Дальше


Contents

Цикл for

for - цикличное выполнение блока кода для каждого элемента некоторой последовательности (Sequence).

Входная последовательность цикла - любая Sequence (в том числе Collection):

  • Array
  • Dictionary
  • Set
  • Range


Вывод на печать всех элементов массива:

for a in [1, 3, 5, 7, 9] {
    print(a)
}

// [1, 3, 5, 7, 9].forEach{print($0)}

Сумма всех элементов массива:

let m = [1, 2, 3, 4, 5]
var sum = 0

for i in m {
    sum += i
}

// m.forEach{sum += $0}

sum  // 15

Сумма чисел от 1 до 10:

var sum = 0

for i in 1...10 {
    sum += i
}

// (1...10).forEach{sum += $0}

sum  // 55

Отображение кривой изменения значения в Playground:

  • клик по темно-серому прямоугольнику в области результатов (напротив sum += i)
  • в редакторе кода (под строкой sum += i) появится график изменения переменной sum.


Обработка массива строк:

let musics = ["Rock", "Jazz", "Pop"]

for music in musics {
    print(music, terminator:" ")
}

// musics.forEach{print($0, terminator:" ")}

Консоль:
Rock Jazz Pop

Посимвольная обработка строки:

for char in "Swift" {
    print(char, terminator:" ")
}

// "Swift".forEach{print($0, terminator:" ")}

Консоль:
S w i f t

Внешние (относительно for) одноименные параметры не пересекаются с локальными:

var char = "a"
let s = "Swift"

for char in s {
    let s = "Char is"
    print("\(s) \(char)")
}

char  // "a"
s     // Swift

Консоль:
Char is S
Char is w
Char is i
Char is f
Char is t

Вариант forEach:

s.forEach{
    let s = "Char is"
    print("\(s) \($0)")
}

Неиспользуемый связанный параметр можно заменить на нижнее подчеркивание:

for _ in 1...3 {
    print("Повторяющаяся строка")
}

// (1...3).forEach{(Int) in print("Повторяющаяся строка")}

Цикл по элементам словаря

Связанные параметры для ключей и значений элементов словаря:

var dic = ["RU":"Россия", "GB":"Великобритания", "US":"США"]

for (id, name) in dic {
    print("\(id) \(name)", terminator:"; ")
}

// dic.forEach{print("\($0) \($1)", terminator:"; ")}

Консоль:
GB Великобритания; US США; RU Россия;

Dictionary - неупорядоченная коллекция.
Порядок элементов при инициализации и при выводе на консоль могут отличаться.

Блокировать получение ключа или значения можно символом "_":

var dic = ["RU":"Россия", "GB":"Великобритания", "US":"США"]

for (id, _) in dic {
    print("\(id)", terminator:" ")
}

// dic.forEach{print("\($0.key)", terminator:" ")}

Консоль:
US RU GB 

Если нужны только ключи или только значения,
то можно воспользоваться свойствами keys и values:

var dic = ["RU":"Россия", "GB":"Великобритания", "US":"США"]

for id in dic.keys {
    print("\(id)", terminator:" ")
}

print()

for name in dic.values {
    print("\(name)", terminator:" ")
}

// dic.keys.forEach{print("\($0)", terminator:" ")}
// dic.values.forEach{print("\($0)", terminator:" ")}

Консоль:
US RU GB
США Россия Великобритания

Представление элементов массива в виде кортежа (индекс, значение):

let musics = ["Rock", "Jazz", "Pop"]

for (id, value) in musics.enumerated() {
    print("\(id + 1). \(value)")
}

// musics.enumerated().forEach{print("\($0 + 1). \($1)")}

Консоль:
1. Rock
2. Jazz
3. Pop

Цикл с заданным шагом

Цикл с шагом, включая конечную границу:

for i in stride(from:1, through:7, by:2) {
    print(i, terminator:" ")
}

// stride(from:1, through:7, by:2).forEach{print($0, terminator:" ")}

// 1 3 5 7 (through:7)

Цикл с шагом, не включая конечную границу:

for i in stride(from:1, to:7, by:2) {
    print(i, terminator:" ")
}

// stride(from:1, to:7, by:2).forEach{print($0, terminator:" ")}

// 1 3 5 (to:7)

Сумма всех нечетных чисел от 1 до 1000:

var sum = 0

for i in stride(from:1, through:1000, by:2) {
    sum += i
}

// stride(from:1, through:1000, by:2).forEach{sum += $0}

sum  // 250000

stride возвращает коллекцию:

stride(from:through:by:)  // StrideThrough<T>

stride(from:to:by:)       // StrideTo<T>

// T - тип данных элементов коллекции

Обратный проход по коллекции

for i in (1...10).reversed() {  // проход от 10 до 1
    print(i, terminator: " ")
}

// (1...10).reversed().forEach{print($0, terminator: " ")}

Консоль:
10 9 8 7 6 5 4 3 2 1
reverse()  - меняет порядок исходной коллекции на обратный
reversed() - не меняет исходную коллекцию, а возвращает элементы в обратном порядке

where в цикле for-in

where указывает дополнительные условия итерации

Сумма всех чётных чисел от 1 до 10:

var sum = 0

for i in 1...10 where i % 2 == 0 {
    sum += i
}

// (1...10).forEach{if $0 % 2 == 0 {sum += $0}}

sum  // 30

Снижение производительности при использовании where:

var isRun = true

// неэффективно
for i in 1...10 where isRun {  // проверка isRun выполняется при каждой итерации
    // тело оператора
}

// эффективно
if isRun {
    for i in 1...10 {
        // тело оператора
    }
}

continue в цикле for-in

continue - переход к следующей итерации, без выполнения фрагмента кода после continue.

Вывод в консоль всех четных чисел из диапазона 1...10:

for i in 1...10 {
    if i % 2 == 0 {
        continue
    }
    print(i, terminator: " ")
}

Консоль:
1 3 5 7 9

continue нельзя использовать в цикле forEach

break в цикле for-in

break - досрочное завершение работы цикла.

Выход из бесконечного цикла при равенстве случайного числа заданному:

for i in 1... {
    if Int.random(in: 0...10) == 5 {
        print("Итерация номер \(i)")
        break
    }
}

Консоль:
Итерация номер 11

Еще один вариант генерации случайного числа:

Int(arc4random_uniform(10))

break нельзя использовать в цикле forEach

Использование метки для прерывания внешнего цикла из внутреннего:

stop:
for i in 1...4 {
    for j in i...4 {
        if j == 3 && i == 2 {
            break stop
        }
        print(i, "-", j)
    }
}

Консоль:
1 - 1
1 - 2
1 - 3
1 - 4
2 - 2

Метки используются с операторами break и contitue

Обработка многомерных коллекций

Объявление:

let a: Dictionary<String: Array<String>> = ["s": ["a", "b", "c"]]

let b: [String: [String]] = ["s": ["a", "b", "c"]]

Пример:

var games = [
    "Red Wings": ["2:1", "2:3"],
    "Capitals": ["3:6", "5:5"],
    "Penguins": ["3:3", "1:2"]
]

for (name, results) in games {
    for result in results {
        print("Игра с \(name) — \(result)")
    }
}

Консоль:
Игра с Penguins — 3:3
Игра с Penguins — 1:2
Игра с Red Wings — 2:1
Игра с Red Wings — 2:3
Игра с Capitals — 3:6
Игра с Capitals — 5:5

Используем цикл forEach:

games.forEach{(name, results) in
    results.forEach{
        print("Игра с \(name) — \($0)")
    }
}

Примеры

1.

var students: [String:[String:UInt]] = [
    "Иванов": ["01-12-2020":5, "02-12-2020":4, "03-12-2020":5],
    "Петров": ["01-12-2020":4, "02-12-2020":5, "03-12-2020":3],
    "Сидоров": ["01-12-2020":4, "02-12-2020":4, "03-12-2020":3]
]

var totalSum: Double = 0
for student in students {
    var sum: UInt = 0
    for marks in student.value {
        sum += marks.value
    }
    let averageMark = Double(sum) / Double(student.value.count)
    totalSum += averageMark
    print(student.key, String(format: "%.2f", averageMark))
}
let totalAverageMark = totalSum / Double(students.count)
print("Общий средний балл:", String(format: "%.2f", totalAverageMark))

2.

typealias Chessman = [String: (alpha:Character, num:Int)?]

var Chessmans: Chessman = [
    "Пешка":("A", 2),
    "Ферзь":("D", 1),
    "Ладья":nil,
]

for name in Chessmans.keys {
    if let position = Chessmans[name] {
        if let pos = position {
            print("\(name) \(pos.alpha)\(pos.num)")
        } else {
            print("\(name) фигура взята")
        }
    }
}



Назад · Оглавление · Дальше

Personal tools
Namespaces

Variants
Actions
Navigation
Tools