Avatar ·

Как преобразовать строку (String) в целое число (Int) в Swift?

Всем привет! Я только начал изучать Swift и столкнулся с проблемой при работе с числами и строками. У меня есть приложение, которое получает данные из текстового поля. Пользователь вводит туда число, например, "123". Мне нужно это число использовать для математических операций. Я пытаюсь сделать так: ```swift let userInput = "123" let result = userInput + 10 // Ошибка! ``` Но компилятор выдаёт ошибку: "Binary operator '+' cannot be applied to operands of type 'String' and 'Int'". Я понимаю, что `userInput` — это строка, а 10 — это целое число. Как мне превратить строку в Int? Я пробовал использовать `Int(userInput)`, но получаю странный тип "Int?" с вопросительным знаком. И если пользователь введёт что-то нечисловое, например "abc", приложение падает с ошибкой. Как правильно и безопасно конвертировать строку в число в 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, когда работаете с пользовательским вводом в интернациональных приложениях или с данными из внешних источников с нестандартным форматированием чисел.