Swift. Цикл for

From AsIsWiki
(Difference between revisions)
Jump to: navigation, search
(Created page with "<div style='max-width:700px;text-align:justify;'> Назад · Оглавление · Дальше ==Ц...")
 
Line 14: Line 14:
 
* Set
 
* Set
 
* Range
 
* Range
* и т.д.
+
 
  
 
Вывод на печать всех элементов массива:
 
Вывод на печать всех элементов массива:
Line 52: Line 52:
 
</pre>
 
</pre>
  
Отображение кривой изменения значения:
+
Отображение кривой изменения значения в Playground:
 
* клик по темно-серому прямоугольнику в области результатов (напротив sum += i)
 
* клик по темно-серому прямоугольнику в области результатов (напротив sum += i)
 
* в редакторе кода (под строкой sum += i) появится график изменения переменной sum.
 
* в редакторе кода (под строкой sum += i) появится график изменения переменной sum.
Line 120: Line 120:
 
// (1...3).forEach{(Int) in print("Повторяющаяся строка")}
 
// (1...3).forEach{(Int) in print("Повторяющаяся строка")}
 
</pre>
 
</pre>
 +
 +
==Цикл по элементам словаря==
  
 
Связанные параметры для ключей и значений элементов словаря:
 
Связанные параметры для ключей и значений элементов словаря:
Line 153: Line 155:
  
 
Если нужны только ключи или только значения,<br>
 
Если нужны только ключи или только значения,<br>
то можно воспользоваться свойствами keys и value:
+
то можно воспользоваться свойствами keys и values:
 
<pre>
 
<pre>
 
var dic = ["RU":"Россия", "GB":"Великобритания", "US":"США"]
 
var dic = ["RU":"Россия", "GB":"Великобритания", "US":"США"]
Line 191: Line 193:
 
</pre>
 
</pre>
  
Проход с шагом, включая конечную границу:
+
==Цикл с заданным шагом==
 +
 
 +
Цикл с шагом, включая конечную границу:
 
<pre>
 
<pre>
 
for i in stride(from:1, through:7, by:2) {
 
for i in stride(from:1, through:7, by:2) {
Line 202: Line 206:
 
</pre>
 
</pre>
  
Проход с шагом, не включая конечную границу:
+
Цикл с шагом, не включая конечную границу:
 
<pre>
 
<pre>
 
for i in stride(from:1, to:7, by:2) {
 
for i in stride(from:1, to:7, by:2) {
Line 226: Line 230:
 
</pre>
 
</pre>
  
Функции возвращают коллекции:
+
stride возвращает коллекцию:
 
<pre>
 
<pre>
 
stride(from:through:by:)  // StrideThrough<T>
 
stride(from:through:by:)  // StrideThrough<T>
Line 235: Line 239:
 
</pre>
 
</pre>
  
Обратный проход по коллекции:
+
==Обратный проход по коллекции==
 +
 
 
<pre>
 
<pre>
 
for i in (1...10).reversed() {  // проход от 10 до 1
 
for i in (1...10).reversed() {  // проход от 10 до 1
Line 248: Line 253:
  
 
<pre>
 
<pre>
reverse()  - меняет порядок коллекции на обратный
+
reverse()  - меняет порядок исходной коллекции на обратный
reversed() - не меняет порядок, а возвращает элементы с конца коллекции
+
reversed() - не меняет исходную коллекцию, а возвращает элементы в обратном порядке
 
</pre>
 
</pre>
  
Line 282: Line 287:
 
     for i in 1...10 {
 
     for i in 1...10 {
 
         // тело оператора
 
         // тело оператора
    }
 
}
 
</pre>
 
 
==Обработка многомерных коллекций==
 
 
Объявление:
 
<pre>
 
let a: Dictionary<String: Array<String>> = ["s": ["a", "b", "c"]]
 
 
let b: [String: [String]] = ["s": ["a", "b", "c"]]
 
</pre>
 
 
Пример:
 
<pre>
 
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
 
</pre>
 
 
Используем цикл forEach:
 
<pre>
 
games.forEach{(name, results) in
 
    results.forEach{
 
        print("Игра с \(name) — \($0)")
 
 
     }
 
     }
 
}
 
}
Line 365: Line 329:
 
Еще один вариант генерации случайного числа:
 
Еще один вариант генерации случайного числа:
 
<pre>
 
<pre>
Int(arc4random_uniform(10)) -
+
Int(arc4random_uniform(10))
 
</pre>
 
</pre>
  
Line 391: Line 355:
  
 
Метки используются с операторами break и contitue
 
Метки используются с операторами break и contitue
 +
 +
==Обработка многомерных коллекций==
 +
 +
Объявление:
 +
<pre>
 +
let a: Dictionary<String: Array<String>> = ["s": ["a", "b", "c"]]
 +
 +
let b: [String: [String]] = ["s": ["a", "b", "c"]]
 +
</pre>
 +
 +
Пример:
 +
<pre>
 +
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
 +
</pre>
 +
 +
Используем цикл forEach:
 +
<pre>
 +
games.forEach{(name, results) in
 +
    results.forEach{
 +
        print("Игра с \(name) — \($0)")
 +
    }
 +
}
 +
</pre>
  
 
==Примеры==
 
==Примеры==

Revision as of 15:47, 14 April 2022

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


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