Как преобразовать строку (String) в целое число (Int) в Swift?
Безопасное преобразование String в Int через инициализатор
В Swift строки и числа — это разные типы, поэтому прямое сложение невозможно. Для преобразования используется встроенный инициализатор Int(String). Он возвращает опциональное значение (Int?), потому что строка может содержать нечисловые символы.
let userInput = "123"
if let number = Int(userInput) {
let result = number + 10
print("Результат: \(result)") // Выведет: 133
} else {
print("Ошибка: строка не содержит число")
}
Ключевой момент — использование if let (optional binding). Это безопасный способ извлечь значение из опционала. Если преобразование удалось, мы получаем Int и работаем с ним. Если нет — выполняем блок else.
Другие способы обработки опционала
- Оператор
??(nil-coalescing): задаёт значение по умолчанию - Принудительное извлечение
!: опасно, используйте только если уверены на 100% - Метод
flatMap: для цепочек преобразований
// Значение по умолчанию через ??
let a = Int("123") ?? 0 // если nil, то 0
// Принудительно (только для проверенных данных!)
let b = Int("123")! // краш, если строка невалидна
// flatMap для цепочек
let c = Int("42").flatMap { $0 * 2 } // Optional(84)
Работа с разными системами счисления
Инициализатор Int умеет обрабатывать не только десятичные числа:
// Шестнадцатеричная система (префикс 0x)
let hex = Int("1A", radix: 16) // Optional(26)
// Двоичная система (префикс 0b)
let bin = Int("1010", radix: 2) // Optional(10)
// Восьмеричная система (префикс 0o)
let oct = Int("17", radix: 8) // Optional(15)
Обработка больших чисел
Для чисел, выходящих за пределы Int, используйте Int64 или Double:
let largeNumber = "999999999999999999"
if let value = Int64(largeNumber) {
print("Успешно: \(value)")
} else {
print("Слишком большое число")
}
// Для чисел с плавающей точкой
let priceString = "19.99"
if let price = Double(priceString) {
let total = price * 2
print("Итого: \(total)") // 39.98
}
Практический пример: калькулятор из текстового поля
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var inputTextField: UITextField!
@IBOutlet weak var resultLabel: UILabel!
@IBAction func calculateButtonTapped(_ sender: UIButton) {
guard let text = inputTextField.text,
let number = Int(text) else {
resultLabel.text = "Введите целое число"
return
}
let doubleValue = number * 2
resultLabel.text = "\(number) × 2 = \(doubleValue)"
}
}
В этом примере guard let проверяет, что текст не nil (хотя у UITextField он всегда есть) и что его можно преобразовать в Int. Если что-то пошло не так — показываем сообщение пользователю.
Важно: всегда проверяйте результат преобразования! Использование ! без проверки — частая причина крашей в продакшене.
Альтернативный подход: использование NumberFormatter для сложных форматов
Если ваши строки содержат пробелы, знаки валют или локализованные разделители, Int(String) может не сработать. В таких случаях лучше использовать NumberFormatter:
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.locale = Locale(identifier: "ru_RU")
// Строка с пробелами и русской локалью
let priceString = "1 234"
if let number = formatter.number(from: priceString)?.intValue {
print("Число: \(number)") // 1234
}
// Строка с валютой
formatter.numberStyle = .currency
let currencyString = "€99.99"
if let price = formatter.number(from: currencyString)?.doubleValue {
print("Цена: \(price)") // 99.99
}
NumberFormatter гибко настраивается: поддерживает разные стили (.decimal, .percent, .currency), учитывает локаль и может обрабатывать сложные форматы чисел. Его недостаток — более многословный код по сравнению с простым инициализатором Int().
Используйте NumberFormatter, когда работаете с пользовательским вводом в интернациональных приложениях или с данными из внешних источников с нестандартным форматированием чисел.
Ответов пока нет.
Войдите чтобы оставить ответ
Блоги