Swift. Фундаментальные типы данных

Домашняя работа к главе 5

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

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

Задание 1

Одним из способов определения типа данных переменной или константы является указание имени конкретного типа через двоеточие после имени параметра, например var thisIsMyVar: String = "".

Как называется такой вид определения типа данных?

Правильный ответ
Явный

Задание 2

Каким еще способом, помимо явного определения типа, можно указать тип данных для объявляемого параметра? Приведите пример.

Правильный ответ

Другим способом является — неявный, когда тип определяется по проинициализированному значению.

Например, var whatIsIt = "Краб" . В этом случае переменная whatIsIt будет иметь тип данных String.

Задание 3

Укажите, какие из строк кода будут успешно выполнены, не вызвав ошибок:

Var myVar = 132
let myName = "Angel"
var myGrilfriend
var countOfMyDogs = 4.96
let name of city = "Cherepovets"
let country = Russia
var age: UInt8 = 5.5
Правильный ответ

  1. Ошибка. Ключевое слово var указано с большой буквы.
  2. Без ошибок
  3. Ошибка. Не определен тип данных (Явно или неявно) и инициируемое (первоначальное) значение.
  4. Без ошибок
  5. Ошибка. Пробелы в имени переменной или константы недопустимы.
  6. Ошибка. Строковый литерал передан без кавычек.
  7. Ошибка. Явно определенный тип данных не соотвествует типу переданного значения.

Задание 4

Укажите, какие из строк кода будут успешно выполнены, не вызвав ошибок. Какой тип данных и значение будет у каждого корректного параметра?

var myName = "Andrey"
var mySurname: String
let myAge = 28
let ageOfMyCat = 21
var sumOfAges = UInt(myAge + ageOfMyCat)
let someText = "My name is \(myName). Im \(myAge) years old."
Правильный ответ

Ошибок нет (в некоторых случаях Xcode Playground может указать на ошибку в строке 2).

  • myName — тип String, значение «Andrey»
  • mySurname — не передано первоначальное значение переменной, по этой причине до первого обращения к параметру в нем должно появиться значение
  • myAge — тип Int, значение 28
  • ageOfMyCat — тип Int, значение 21
  • sumOfAges — тип UInt, значение 49
  • someText — тип String, значение «My name is Andrey. Im 28 years old.»

Задание 5

Будет ли корректно выполнен следующий код? Как исправить код, если он работает некорректно?

var first = "myVar"
let second: String
second = first
second = "myVar"
Правильный ответ

В связи с особенностями работы Xcode Playground, у вас может возникнуть ошибка в одном из следующих случаев:

Вариант 1: В Swift запрещено объявлять переменную или константу без инициализирующего значения (если конечно она не опционального типа данных, о которых мы будем говорить позже). В этом случае вы можете получить ошибку в строке № 2.

Вариант 2: Если Xcode Playground позволит вам создать пустую переменную, то ошибка возникнет в строке № 4, так как константе повторно инициализируется значения.

Задание 6

Будет ли корректно выполнен следующий код? Как исправить код, если он работает некорректно?

var one = 5
var two = -5.12
var three = UInt(one + two)
Правильный ответ

Код вызовет ошибку, т.к. функции UInt(_:) в качестве параметра происходит попытка передачи результата сложения чисел разных типов (Int и Double).

Для исправления кода необходимо преобразовать значение переменной one к типу Double, либо — two к Int. В данном случае это не важно, т.к. для преобразования дробного вида к целому просто отбрасывается дробная часть числа.

Задание 7

Будет ли корректно выполнен следующий код? Как исправить код, если он работает некорректно?

var one: Double = 12
var two = 3.14
one = two
Правильный ответ

Код будет выполнен корректно.

Задание 8

Объявите константу с именем myName и проинициализируйте ей свое имя. Выведите на консоль строку Меня зовут [name], где вместо [name] должно быть значение параметра myName.

Правильный ответ

let myName = "Василий"
print("Меня зовут \(myName)")

Задание 9

Вам даны две переменные. Первая дробного типа хранит в себе расстояние в километрах. Вторая целочисленная хранит в себе время в секундах, за которое преодолели данное расстояние.

Найдите скорость в метрах в минуту.

Правильный ответ

// расстояние
var lengthOfPath = Double(52)
// время
var seconds = Int(360)
// вычисление скорости в метрах в минуту
var v = (lengthOfPath*1000) / (Double(seconds)/60)

Задание 10

Даны два целочисленных трехзначных числа. Найти шестизначное, образованное слиянием данных чисел в одно. К примеру из чисел 111 и 222 должно получиться 111222.

Правильный ответ

var a = 166
var b = 556
var c = Int("\(a)\(b)")

Задание 11

  1. Объявите две целочисленные переменные типов Int8 и UInt8. В одну из них запишите максимальное значение, которое может принять параметр типа UInt8, в другую — минимальное значение, которое может принять параметр типа Int8. Обратите внимание на то, какое значение в какую переменную может быть записано.
  2. Выведите полученные значения на консоль.
Правильный ответ

//1
var a: Int8 = Int8.min
var b: UInt8 = UInt8.max

//2
print(a)
print(b)

Доступ закрыт

Дополнительные 15 заданий доступны только подписчикам

Оформить доступ


36 Comments

  1. Евгений Антонов:

    Зачем 19 задание?

    • У каждого человека свой уровень усвоения материала. Порой даже самые простые задания вызывают ступор. Но вы натолкнули меня на мысль: может быть стоит делить задания по уровням? К примеру бронзовый и золотой. Такие простые задания давать в самом начале в «бронзовом», а более сложные — в «золотом».

      • kuzma.zzz:

        Предлагаю в 19 задание добавить ответ в одну строку:
        print(» * * *\n * * * * \n * *»)

        • michael_siddd:

            За то так приятнее смотритсяlet w = «»»*    *    *  * * * *   *   *»»»print(w)   

          • michael_siddd:

              Вы можете вставить в комментарий код прямо из Xcode, при этом он сохранит свое форматирование (отступы и подсветку). Прям «в точности» как в Xcode!!!!!!!!!   

  2. ttork354:

    Поправьте, если не прав.
    Задание 9:

    var distanceInKm: Double = 4 // 4
    var timeInSec = 43 // 43
    var speedInMetr = (distanceInKm * 1000) / (Double(timeInSec) / 60) // 5581.395348837209

    Выходит, что правильный ответ — не правильный, поскольку тут кроме формулы по физике нужно юзнуть Decimal и импортировать Foundation, а еще прочитать доп материал к главе 5 =)

    • Да, ваш ответ верный. В нем точно так же, как и в приведенном выполняются все условия, но при этом Decimal не используется, а Foundation не нужен для типов Int и Double. Итоговый ответ именно в Double
      print( type(of:speedInMetr) ) //Double

  3. mambazoomba:

    Виталий, здравствуйте. У меня к Вам вопрос по заданию 6 из главы 6 (Кортежи)
    Спрашиваю здесь, так как в том разделе комментарии, по неведомой для меня причине, закрыты.

    Продублирую сюда условие, чтобы было удобнее:
    1. Объявите константу и запишите в нее свое имя.
    2. Объявите переменную типа UInt8 и запишите в нее свой возраст.
    3. Объявите кортеж и явно определите его тип данных, как (name: String, age: Int).
    4. В первый элемент кортежа запишите значение константы с именем.
    5. Во второй элемент кортежа запишите значение из переменной с вашим возрастом.

    Мое решение:
    let myName = «Roman»
    var myAge: Int8 = 22
    var (r1, r2) = (myName, Int(myAge))
    print(» Я — \(r1) и мне \(r2) годика «)

    Результат по факту один и тот же, но можете пояснить, правильным ли будет данное решение?

  4. gilbertromn17:

    Вопрос по 4 заданию. Компилятор не выдал ошибки и все работает

  5. martin:

    Здравствуйте, Василий. Только начал изучать язык Swift по купленной Вашей книге. У меня вопрос: в задании № 10 в var c всё приведено к Int. А можно ли это задание сделать так, будет ли это тоже правильно? Спасибо:

    let numOne = 111
    let numTwo = 222
    let numThree = («\(numOne)\(numTwo)»)

    print(numThree)

  6. IlyaShpilko:

    Почему в 4 задание ошибка 2? Просто Xcode не выдаст ошибку, он просто прировняет строку к nil.

  7. Мishabux:

    18-е задание, 2-й пункт
    В задании сказано указать константу, а во втором пункте указана переменная (var: char)
    Спасибо за материал))

  8. Deschain:

    Василий, это лучшие задачи что я когда либо делал, хоть я и только начал изучать Swift) Каждую задачу можно сделать, основываясь на материал из книги, однако над ними все равно надо хорошо подумать, благодаря чему материал усваивается НАМНОГО лучше, ну лично для меня, не знаю как остальным) Спасибо огромное, очень интересно, особенно мне понравилась задача №19, на первый взгляд не легкая, но после первой рабочей строчки кажащуяся очень простой.

  9. photofeeling:

    8-е задание, в правильном ответе потеряли условие с name:

    let myName: String = «Dmitriy»
    let name = myName
    print («Меня зовут \(name)»)

  10. Constantine:

    Здравствуйте, не судите что «нашел к чему придраться», просто хочу исправить грамматическую ошибку в тексте. Выше сказано «быть проведены со значения различных типов» в слове «значения» не хватает окончания «ми», чтобы получилось «со значениями…»

  11. Denis Shekh:

    Здравствуйте все.

    Василий, или другие пользователи, подскажите, а почему в задании 14, подпункт 4, такое решение:
    var res = Double(second).truncatingRemainder(dividingBy: third) // 4.999999618530273
    ?

    Не правильней ли было бы так:
    var res = Double(second.truncatingRemainder(dividingBy: Float(third))) // 5
    ?

  12. Alekschatov:

    Привет, спасибо за задания очень радуют )

    в задании №17 я сначала написал так : let pCircle1 = 2 * 3.14 * Double(length) // 69.08

    почему Playground (ver 11.4) не ругается, что двойка не переведена в Double?  Результат верный.

    Я полагаю СРЕДА сама из выражения понимает, что результат Double и значит ранее необьявленные объекты вроде этой двойки автоматом переводятся ?

  13. dima.sergeenko:

    10 задание сделал так:
    // Задание 10
    var firstD = 111, secondD = 222
    var six = String(firstD) + String(secondD)
    var sixDec = Int(six)

  14. bodyaibodya:

    А можете объяснить, в чем разница между моим решением и правильным ответом? Если и там и там получается вывести правильно цифру?//мое решениеlet number1 = 166let number2 = 556let number = String(number1) + String(number2)//правильный ответ var a = 166var b = 556var c = Int(«\(a)\(b)»)

  15. valkodenis:

    Здравствуйте, непонятно задание 25, там и без скобок верный порядок, зачем скобки расставлять?5 * 3 — 4 / 2 * 2 //11 (5 * 3) — ((4 / 2) * 2) //11

  16. zeromance:

    Василий, я не уверен, когда писались эти задачки, но в части из них, где вы приводите цифры к Float, чтобы разделить, уже можно не делать
    Для примера, у меня без ошибок работает такой скрипт (аналог из последней задачи):
    var a = 13.13
    var b = 31.31
    let average = Float((a + b) / 2)

  17. maximsavin1:

    Добрый вечер,

    В 25 номере можно вообще не ставить скобки, сделать как в ответе и поставить их только в части (4/2), Xcode везде выдаст 11.

    А 19-ое задание можно выполнить через тройные кавычки, результат будет одинаковый.

  18. Catmint:

    Я 10-е так решил:

    var num1 = 333
    var num2 = 555

    var sum = (num1*1000) + num
    // 333555

  19. khasan7778:

    Добрый день. В задании 6 помимо разных типов данных, будет выдаваться ошибка, так как функция UInt использует только беззнаковые типы данных. Правильно?

  20. anjuta1211:

    Здравствуйте. Начала изучать Swift по Вашей книге в печатном варианте (пятое издание). Пока все очень нравится. По данной главе возник вопросик. В таблице 5.1 для типа данных  UInt и UInt64 указаны не удвоенные максимальные значения, а именно 9223372036854775807. Это опечатка? Или для данных типов данных есть исключение?

  21. 5695351:

    В 17 задании для Пи можно использовать Double.pi

Добавить комментарий