понедельник, 25 декабря 2017 г.

Swift 8. Collection Types - Dictionary

В 8 уроке рассмотрены словари - Dictionary.
Домашнее задание к 8 уроку:

/*
 1. Создайте дикшинари как журнал студентов, где имя и фамилия студента это ключ, а оценка за контрольную значение. Некоторым студентам повысьте оценки - они пересдали. Потом добавьте парочку студентов, так как их только что перевели к вам в группу. А потом несколько удалите, так как они от вас ушли :(

 После всех этих перетрубаций посчитайте общий бал группы и средний бал

 2. Создать дикшинари дни в месяцах, где месяц это ключ, а количество дней - значение.
 В цикле выведите ключ-значение попарно, причем один раз выведите через тюплы, а другой раз пройдитесь по массиву ключей и для каждого из них доставайте значения.

 3. Создать дикшинари , в которой ключ это адрес шахматной клетки (пример: a5, b3, g8), а значение это Bool. Если у клетки белый цвет, то значение true, а если черный - false. Выведите дикшинари в печать и убедитесь что все правильно.

 Рекомендация: постарайтесь все сделать используя вложенный цикл (объяснение в уроке).
 */


/*
 1
 */

var listStudentDictionary = ["Alex Timakov": 5, "Vasya Ivanov": 4, "Dima Pupkin": 2]
listStudentDictionary["Dima Pupkin"] = 4
listStudentDictionary["Vasya Ivanov"] = 5
listStudentDictionary["Natasha Sidorova"] = 2
listStudentDictionary["Masha Ivanova"] = 4
listStudentDictionary["Dima Pupkin"] = nil
listStudentDictionary["Vasya Ivanov"] = nil

var sumRating = 0

for value in listStudentDictionary.values {
    sumRating += value
}
let averageRating = listStudentDictionary.count != 0 ? Double(sumRating) / Double(listStudentDictionary.count) : 0.0
print("1.\n")
print("Sum Rating: \(sumRating). Average Rating: \(averageRating)")

/*
 2
 */

var monthsDictionary = [String: Int]()
let quantityDaysInMonthsArray = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
let monthsNamesArray = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November","December"]
for (index, quantity) in quantityDaysInMonthsArray.enumerated() {
    monthsDictionary[monthsNamesArray[index]] = quantity
}

print("\n2.1.\n")
for (month, days) in monthsDictionary {
    print("\(month) - \(days)")
}

print("\n2.2.\n")
for month in monthsDictionary.keys {
    print("\(month): \(monthsDictionary[month]!)")
}

/*
 3
 */

print("\n3.\n")

var flag = false;
let charString = "abcdefgh"
var chessDictionary = [String: Bool]()
for charIndex in charString.indices {
    for number in 1...8 {
        let key = String(charString[charIndex]) + String(number)
        chessDictionary[key] = flag;
        flag = !flag
    }
}
print("Chess Dictionary: \(chessDictionary)\n Count: \(chessDictionary.count)")


Вывод в консоль:

1.

Sum Rating: 11. Average Rating: 3.66666666666667

2.1.

July - 31
April - 30
May - 31
November - 30
February - 28
December - 31
January - 31
August - 31
June - 30
September - 30
March - 31
October - 31

2.2.

July: 31
April: 30
May: 31
November: 30
February: 28
December: 31
January: 31
August: 31
June: 30
September: 30
March: 31
October: 31

3.

Chess Dictionary: ["e2": true, "a2": true, "c8": true, "d1": false, "e3": false, "g2": true, "b6": true, "b1": false, "f5": false, "h2": true, "f6": true, "f3": false, "g6": true, "e1": false, "c7": false, "a3": false, "e6": true, "f2": true, "h7": false, "d5": false, "c4": true, "g5": false, "g3": false, "a5": false, "h8": true, "c2": true, "c3": false, "a1": false, "g4": true, "f4": true, "e8": true, "a6": true, "g1": false, "c1": false, "h5": false, "h3": false, "e7": false, "f8": true, "d6": true, "d8": true, "d4": true, "b4": true, "e5": false, "a4": true, "g8": true, "d3": false, "h1": false, "c6": true, "d7": false, "a8": true, "d2": true, "h6": true, "a7": false, "b5": false, "b3": false, "f1": false, "b2": true, "g7": false, "b7": false, "e4": true, "f7": false, "h4": true, "b8": true, "c5": false]
 Count: 64

Swift 7. Collection Types - Arrays

В этом уроке рассматриваем использование  массивов в Swift.

Домашнее задание к уроку:

/*
 1. создать массив "дни в месяцах"
 12 элементов содержащих количество дней в соответствующем месяце

 используя цикл for и этот массив

 - выведите количество дней в каждом месяце (без имен месяцев)
 - используйте еще один массив с именами месяцев чтобы вывести название месяца + количество дней
 - сделайте тоже самое, но используя массив тюплов с параметрами (имя месяца, кол-во дней)
 - сделайте тоже самое, только выводите дни в обратном порядке (порядок в массиве не меняется)

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

 2. Сделайте первое задание к уроку номер 4 используя массивы:

 (создайте массив опшинал интов и посчитайте сумму)

 - в одном случае используйте optional binding
 - в другом forced unwrapping
 - а в третьем оператор ??

 3. создайте строку алфавит и пустой массив строк

 в цикле пройдитесь по всем символам строки попорядку, преобразовывайте каждый в строку и добавляйте в массив, причем так, чтобы на выходе получился массив с алфавитом задом-наперед
 */

/*
 1
 */

let quantityDaysInMonthsArray = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

// 1.1

print("\n1.1")
print("Month number with quantity days:\n")

for (index, quantity) in quantityDaysInMonthsArray.enumerated() {
    print("Month: \(index + 1), Days: \(quantity)")
}

let monthsNamesArray = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November","December"]

// 1.2

print("\n1.2")
print("Month Names with quantity days:\n")

for (index, quantity) in quantityDaysInMonthsArray.enumerated() {
    print("Month: \(monthsNamesArray[index]), Days: \(quantity)")
}

// 1.3

print("\n1.3")
print("Month Names with quantity days (tuples array):\n")

var tuplesArray = [(month: String, days: Int)]();

for (index, quantity) in quantityDaysInMonthsArray.enumerated() {
    tuplesArray.append((monthsNamesArray[index], quantity))
}
for tuple in tuplesArray {
    print(tuple)
}

// 1.4

print("\n1.4")
print("Month Names with quantity days (tuples array) - Reversed:\n")

for tuple in tuplesArray.reversed() {
    print(tuple)
}

// 1.5

let (month, day) = (4, 28)

let monthIndex = month - 1
var sumDays = day
for quantity in quantityDaysInMonthsArray[0..<monthIndex] {
    sumDays += quantity
}
print("\n1.5")
print("days have passed from the \(day) \(monthsNamesArray[month - 1]): \(sumDays)\n")

/*
 2
 */

let stringArray = ["4", "2a", "1", "3sd2","5", "3"];
var optionalIntArray = [Int?]();
for str in stringArray {
    optionalIntArray.append(Int(str))
}

// 2.1

var sum = 0
for optionalInt in optionalIntArray {
    if let intValue = optionalInt {
        sum += intValue
    }
}
print("\n2.1")
print("Optional Binding sum:",sum)

// 2.2

sum = 0
for optionalInt in optionalIntArray {
    if optionalInt != nil {
        sum += optionalInt!
    }
}
print("\n2.2")
print("forced unwrapping sum:",sum)

// 2.3

sum = 0
for optionalInt in optionalIntArray {
        sum += optionalInt ?? 0
}
print("\n2.3")
print("Default value (??) sum:",sum)

/*
 3
*/

let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
var reversedAlphabetArray = [String]()
for index in alphabet.indices.reversed() {
    let stringWithChar = String(alphabet[index])
    reversedAlphabetArray += [stringWithChar];
}
print("\n3")

print("Strings reversed alphabet:",reversedAlphabetArray)


Вывод в Консоль:


1.1
Month number with quantity days:

Month: 1, Days: 31
Month: 2, Days: 28
Month: 3, Days: 31
Month: 4, Days: 30
Month: 5, Days: 31
Month: 6, Days: 30
Month: 7, Days: 31
Month: 8, Days: 31
Month: 9, Days: 30
Month: 10, Days: 31
Month: 11, Days: 30
Month: 12, Days: 31

1.2
Month Names with quantity days:

Month: January, Days: 31
Month: February, Days: 28
Month: March, Days: 31
Month: April, Days: 30
Month: May, Days: 31
Month: June, Days: 30
Month: July, Days: 31
Month: August, Days: 31
Month: September, Days: 30
Month: October, Days: 31
Month: November, Days: 30
Month: December, Days: 31

1.3
Month Names with quantity days (tuples array):

(month: "January", days: 31)
(month: "February", days: 28)
(month: "March", days: 31)
(month: "April", days: 30)
(month: "May", days: 31)
(month: "June", days: 30)
(month: "July", days: 31)
(month: "August", days: 31)
(month: "September", days: 30)
(month: "October", days: 31)
(month: "November", days: 30)
(month: "December", days: 31)

1.4
Month Names with quantity days (tuples array) - Reversed:

(month: "December", days: 31)
(month: "November", days: 30)
(month: "October", days: 31)
(month: "September", days: 30)
(month: "August", days: 31)
(month: "July", days: 31)
(month: "June", days: 30)
(month: "May", days: 31)
(month: "April", days: 30)
(month: "March", days: 31)
(month: "February", days: 28)
(month: "January", days: 31)

1.5
days have passed from the 28 April: 118


2.1
Optional Binding sum: 13

2.2
forced unwrapping sum: 13

2.3
Default value (??) sum: 13

3

Strings reversed alphabet: ["Z", "Y", "X", "W", "V", "U", "T", "S", "R", "Q", "P", "O", "N", "M", "L", "K", "J", "I", "H", "G", "F", "E", "D", "C", "B", "A"]

вторник, 27 июня 2017 г.

Swift 6. Strings and Characters

В этом уроке рассмотрены строки String и символы Character.
Домашнее задание 6 урок:

1. Выполните задание 
 Создать пять строковых констант
Одни константы это только цифры, другие содержат еще и буквы

Найти сумму всех этих констант приведя их к Int
только вместо forced unwrapping и optional binding используйте оператор ??

Когда посчитаете сумму, то представьте свое выражение в виде строки
Например: 5 + nil + 2 + 3 + nil = 10

но в первом случае используйте интерполяцию строк, а во втором конкатенацию

2. Поиграйтесь с юникодом и создайте строку из 5 самых классных по вашему мнению символов,
можно использовать составные символы. Посчитайте длину строки методом SWIFT и Obj-C

3. Создайте строку английский алфавит, все буквы малые от a до z

задайте константу - один из символов этого алфавита

Используя цикл for определите под каким индексов в строке находится этот символ


import Foundation
//Lesson 6. Strings and Characters

/*
 1. Выполните задание #1 урока о базовых операторах: http://vk.com/topic-58860049_31536965
 только вместо forced unwrapping и optional binding используйте оператор ??

 Когда посчитаете сумму, то представьте свое выражение в виде строки
 Например: 5 + nil + 2 + 3 + nil = 10

 но в первом случае используйте интерполяцию строк, а во втором конкатенацию
 */
print("N1\n")

let arrayString = ["2", "a32", "4", "b", "4"]
var sum = 0
var sumString = ""
for stringInt in arrayString {
    let value = Int(stringInt)
    sum += value ?? 0
    if !sumString.isEmpty {
        sumString += " + "
    }
    if let intValue = value {
        sumString += String(intValue)
    } else {
        sumString += "nil"
    }
}
print("\(sumString) = \(sum)")

/*
 2. Поиграйтесь с юникодом и создайте строку из 5 самых классных по вашему мнению символов,
 можно использовать составные символы. Посчитайте длину строки методом SWIFT и Obj-C
 */

print("\nN2\n")

let stringUnicode = "\u{1F436} \u{1F496} \u{1F425} \u{1F431} \u{1F428}"

print(stringUnicode)
print("Length Swift : \(stringUnicode.characters.count). Length Objective-C: \((stringUnicode as NSString).length)")

/*
 3. Создайте строку английский алфавит, все буквы малые от a до z

 задайте константу - один из символов этого алфавита

 Используя цикл for определите под каким индексов в строке находится этот символ
 */
print("\nN3\n")

let alphabetString = "abcdefghijklmnopqrstuvwxyz"
var searchCharacter: Character = "m"
let index = alphabetString.index(of: searchCharacter)
var indexFor = 0
for letter in alphabetString {
    if letter == searchCharacter {
        print("Index \"\(searchCharacter)\" in Alphabet: \"\(alphabetString)\" is: \(indexFor)")
        break
    }
    indexFor += 1
}
if indexFor == alphabetString.characters.count  {
    print("Character \"\(searchCharacter)\" not found in Alphabet: \"\(alphabetString)\"")
}

*************************************************************************

N1

2 + nil + 4 + nil + 4 = 10

N2

🐶 💖 🐥 🐱 🐨
Length Swift : 9. Length Objective-C: 14

N3

Index "m" in Alphabet: "abcdefghijklmnopqrstuvwxyz" is: 12

понедельник, 26 июня 2017 г.

Swift 5. Basic Operators

В этом уроке рассматриваются базовые операторы (унарные, бинарные и тернарные), а так же Range Operator.
Домашнее задание к  уроку 5:

1. Посчитать количество секунд от начала года до вашего дня рождения. Игнорируйте високосный год и переходы на летнее и зимнее время. Но если хотите - не игнорируйте :)

2. Посчитайте в каком квартале вы родились

3. Создайте пять переменных типа Инт и добавьте их в выражения со сложением, вычитанием, умножением и делением. В этих выражениях каждая из переменных должна иметь при себе унарный постфиксный или префиксный оператор. Переменные могут повторяться.

Убедитесь что ваши вычисления в голове или на бумаге совпадают с ответом. Обратите внимание на приоритет операций

4. Шахматная доска 8х8. Каждое значение в диапазоне 1…8. При заданных двух значениях по вертикали и горизонтали определите цвет поля. Если хотите усложнить задачу, то вместо цифр на горизонтальной оси используйте буквы a,b,c,d,e,f,g,h


//Lesson 5. Basic Operator

/*
 1. Посчитать количество секунд от начала года до вашего дня рождения. Игнорируйте високосный год и переходы на летнее и зимнее время. Но если хотите - не игнорируйте :)
 */
print("N1\n")
// 04 august

let numberDay = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 4
let numberSecond = numberDay * 24 * 60 * 60
print("Number Second to 04.08: \(numberSecond)")

/*
 2. Посчитайте в каком квартале вы родились
 */
print("\nN2\n")

let monthBirthday = 8
var numberKvartal = monthBirthday / 3
numberKvartal += monthBirthday % 3 > 0 ? 1 : 0
print("Number quarter 04.08: \(numberKvartal)")

/*
3. Создайте пять переменных типа Инт и добавьте их в выражения со сложением, вычитанием, умножением и делением. В этих выражениях каждая из переменных должна иметь при себе унарный постфиксный или префиксный оператор. Переменные могут повторяться.

Убедитесь что ваши вычисления в голове или на бумаге совпадают с ответом. Обратите внимание на приоритет операций
*/
print("\nN3\n")
print("No infix and postfix operators ++ -- in new  Swift version")

/*
4. Шахматная доска 8х8. Каждое значение в диапазоне 1…8. При заданных двух значениях по вертикали и горизонтали определите цвет поля. Если хотите усложнить задачу, то вместо цифр на горизонтальной оси используйте буквы a,b,c,d,e,f,g,h
*/
print("\nN4\n")

let xChessCoordinat = ["a", "b", "c", "d", "e", "f", "g", "h"]

let chessPoint = ("e", 7)

if let index = xChessCoordinat.index(of: chessPoint.0) {
    let sum = index + 1 + chessPoint.1
    if (sum) % 2 == 0 {
        print("Black square")
    } else {
        print("White square")
    }
    
} else {
    print("Error first coordinate")
}

четверг, 22 июня 2017 г.

Swift 4. The Basics (Optionals)

В этом уроке рассматриваются опционалы - типы у которых значения, могут быть  nil.

Домашнее задание:

1. Создать пять строковых констант

Одни константы это только цифры, другие содержат еще и буквы

Найти сумму всех этих констант приведя их к Int

(Используйте и optional binding и forced unwrapping)

2. С сервера к нам приходит тюпл с тремя параметрами:

statusCode, message, errorMessage (число, строка и строка)

в этом тюпле statusCode всегда содержит данные, но сама строка приходит только в одном поле

если statusCode от 200 до 300 исключительно, то выводите message,

в противном случает выводите errorMessage

После этого проделайте тоже самое только без участия statusCode

3. Создайте 5 тюплов с тремя параметрами:

имя, номер машины, оценка за контрольную

при создании этих тюплов не должно быть никаких данных

после создания каждому студенту установите имя

некоторым установите номер машины

некоторым установите результат контрольной

выведите в консоль:

- имена студента
- есть ли у него машина
- если да, то какой номер
- был ли на контрольной
- если да, то какая оценка


//Lesson 4. Optional

/*
 1. Создать пять строковых констант

 Одни константы это только цифры, другие содержат еще и буквы

 Найти сумму всех этих констант приведя их к Int

 (Используйте и optional binding и forced unwrapping)
 */

print("1\n")
var sum = 0
let (value1, value2, value3, value4, value5) = ("2", "4b", "1", "1a", "5")
if let intValue1 = Int(value1) {
    sum += intValue1
}
if let intValue2 = Int(value2) {
    sum += intValue2
}
if let intValue3 = Int(value3) {
    sum += intValue3
}
if let intValue4 = Int(value4) {
    sum += intValue4
}

if Int(value5) != nil  {
    sum += Int(value5)!
}

print("Sum:", sum)

/*
 2. С сервера к нам приходит тюпл с тремя параметрами:

 statusCode, message, errorMessage (число, строка и строка)

 в этом тюпле statusCode всегда содержит данные, но сама строка приходит только в одном поле

 если statusCode от 200 до 300 исключительно, то выводите message,

 в противном случает выводите errorMessage

 После этого проделайте тоже самое только без участия statusCode
 */

print("\n2.1\n")

let response: (statusCode: Int, message: String?, errorMessage: String?) = (300, "Response", nil)
if response.statusCode >= 200 && response.statusCode <= 300 {
    if let message = response.message {
        print("Success. Message:", message)
    } else {
        print("Success. No Message:")
        
    }
} else {
    if let message = response.errorMessage {
        print("Error. Message:", message)
    } else {
        print("Error. No Message:")
    }
}

print("\n2.2\n")

if let message = response.message {
    print("Success. Message:", message)
} else if let errorMessage = response.errorMessage {
    print("Error. Message:", errorMessage)
} else {
    print("Error. No Message:")
}

/*
 3. Создайте 5 тюплов с тремя параметрами:

 имя, номер машины, оценка за контрольную

 при создании этих тюплов не должно быть никаких данных

 после создания каждому студенту установите имя

 некоторым установите номер машины

 некоторым установите результат контрольной

 выведите в консоль:

 - имена студента
 - есть ли у него машина
 - если да, то какой номер
 - был ли на контрольной
 - если да, то какая оценка */

print("\n3\n")

var student1: (name: String?, carNumber: String?, mark: Double?)
var student2: (name: String?, carNumber: String?, mark: Double?)
var student3: (name: String?, carNumber: String?, mark: Double?)
var student4: (name: String?, carNumber: String?, mark: Double?)
var student5: (name: String?, carNumber: String?, mark: Double?)

student1.name = "Vasya"
student2.name = "Petia"
student3.name = "Ivan"
student4.name = "Nikolay"
student5.name = "Alex"

student1.carNumber = "AK54"
student1.mark = 4.5
student2.mark = 3.1
student5.carNumber = "RUS"

let arrayStudent = [student1, student2, student3, student4, student5]
for student: (name: String?, carNumber: String?, mark: Double?) in arrayStudent {
    let (name, carNumber, mark) = student
    if let realName = name {
        print("Name:", realName, terminator: " ")
    }
    if let realNumber = carNumber {
        print("Car:", realNumber, terminator: " ")
    }
    if let realmark = mark {
        print("Mark:", realmark, terminator: " ")
    }
    print("")

}