Урок 15. Преобрзование типов

16 Мая 2023

Задача 15.1 📚

Перед вами словарь:

				
					let people = ["Tim": "56.76", "Bob": "78", "Helga": "36.2"]
				
			

Требуется получить значение по ключу “Tim” из словаря и преобразовать его в целое число. Если преобразование не удалось, присвоить значение 0.

				
					let people = ["Tim": "56.76", "Bob": "78", "Helga": "36.2"]

let firstResult = Int(people["Tim"] ?? "") ?? 0
				
			

В данном коде мы используем оператор ??, чтобы извлечь значение по ключу “Tim” из словаря people. Если значение равно nil, мы используем пустую строку “” в качестве альтернативного значения. Затем мы преобразуем полученное значение в целое число с помощью  Int(). Если преобразование не удалось, мы используем значение по умолчанию 0. Результат присваивается переменной firstResult.

Это задание можно было решить и с опциональной привязкой. 

				
					let people = ["Tim": "56.76", "Bob": "78", "Helga": "36.2"]
var firstResult = 0

if let timValue = people["Tim"], let timInt = Int(timValue) {
	firstResult = timInt
}
				
			

Обратите внимание что в конструкции if можно извлекать значения последовательно, через запятую, сперва мы извлекаем значение, получаем свойство timValue, а затем мы это значение пытаемся преобразовать к типу Int. и внутри блока условия, мы присваиваем timInt ранее созданному свойству. В целом если вы создали свойство firstResult внутри условной конструкции if это тоже не будет считаться ошибкой, потому что в контексте не сказано как мы это новое свойство используем:

				
					let people = ["Tim": "56.76", "Bob": "78", "Helga": "36.2"]

if let timValue = people["Tim"], let timInt = Int(timValue) {
	let result = timInt
	print(result)
} else {
	let result = 0
	print(result)
}
				
			

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

Если вы сделали привязку опционалов в разных условиях это тоже не ошибка:

				
					let people = ["Tim": "56.76", "Bob": "78", "Helga": "36.2"]

if let timValue = people["Tim"] {
	if let timInt = Int(timValue) {
		let result = timInt
		print(result)
	} else {
		let result = 0
		print(result)
	}
}
				
			

Но лучше использовать предыдущий вариант, так как там меньше скобок, которые делают код, тяжелым для восприятия, любая вложенная структура может усложнить код.

Задача 15.2 📚

Создайте два свойства типа Int, и произведите над ними операцию деление, но сделайте так что бы результат получился типа Double.

				
					let firstNumber = 11
let secondNumber = 8

let result = Double(firstNumber) / Double(secondNumber) // 1.375
				
			

Объявляем два свойства с типом Int, Затем производим операцию деления с использованием преобразования типов к Double. Результат сохраняется в переменной result. 

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

Приведение каждого из свойств к типу Double делает расчеты точнее, в отличии от следующего варианта:

				
					let firstNumber = 11
let secondNumber = 8

let result = Double(firstNumber / secondNumber) // 1
				
			

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

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

				
					let firstNumber: Int = 11
let secondNumber: Int = 8

let result: Double = Double(firstNumber) / Double(secondNumber)
				
			

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

“Преобразование к типу” еще называют “Приведением к типу”, но для второго понятия есть определенная концепция, которая к преобразованию не имеет ни какого отношения, о ней мы тоже будем разговаривать в дальнейшем.

Поддержите наш проект, и помогите изменить подход к обучению!

Развивайся вместе с нами

Поддержите наш проект, и помогите изменить подход к обучению!

Address List

Social Networks

Поддержите наш проект, и помогите изменить подход к обучению!