Конвертировать Int в String в Swift

554

Я пытаюсь работать, как бросить Intв Stringв Swift.

Я придумываю обходной путь, используя, NSNumberно я бы хотел выяснить, как все это сделать в Swift.

let x : Int = 45
let xNSNumber = x as NSNumber
let xString : String = xNSNumber.stringValue
Стив Маршалл
источник

Ответы:

961

Преобразование Intв String:

let x : Int = 42
var myString = String(x)

И наоборот - преобразование Stringв Int:

let myString : String = "42"
let x: Int? = myString.toInt()

if (x != nil) {
    // Successfully converted String to Int
}

Или, если вы используете Swift 2 или 3:

let x: Int? = Int(myString)
Шай
источник
2
Пока это работает, используйте toStringфункцию, показанную в ответе ниже.
Ибакос
2
IntПохоже, нет toString()метода по крайней мере не в редактировании Xcode 6.2: я вижу, что есть глобальный toStringметод ( не Int.toString() ), кто-нибудь знает преимущество по сравнению с использованием String()конструктора?
Ниллок
Обратите внимание, что String(Int?)пишет «Необязательно (Int)», по крайней мере, в Swift 2, это не может быть то, что вы имели в виду. Используйте вместо этогоInt?.description
Teejay
Замечательно, но у меня не работает. У меня есть необязательный Int, и String (myInt) не компилируется - он утверждает, что «Int? Не может быть преобразован в String». Для меня нет доступных методов toString () или toInt (), или там нет stringValue и intValue. Даже String (myInt!) Скажет мне, что инициализатор был переименован во что-то вроде String (описание: myInt!).
Мотти Шнеор
9
Для Swift 4 см. Ответ Хамеда Гха ниже. Правильное использованиеString(describing: x)
Дэвид Гей
92

Проверьте ответ ниже:

let x : Int = 45
var stringValue = "\(x)"
print(stringValue)
Premkumar
источник
45
Мех, это уродливый и ненужный обходной путь, когда Stringуже принимается конструкторInt
Габриэле Петронелла,
3
что не так вы нашли это? почему вы подавили голосование? @GabrielePetronella
ПРЕМКУМАР,
2
это просто ужасный способ достижения желаемого результата. Ответ технически правильный, однако, и по этой причине я не понизил голос.
Габриэле Петронелла,
Я не думаю, что это особенно уродливо, за исключением того, что некоторые инструменты синтаксического анализа могут не справиться с интерполяцией строк. Иначе кто знает - может быстрее. Использование "" + x в Javascript, как правило, быстрее, чем использование конструктора String, например. Этот пример всего на пару символов короче, но я бы предпочел интерполяцию строк в тех случаях, когда вы строили предложение из нескольких переменных.
Дести
1
Я не стал бы опускать этот ответ только потому, что он уродлив, но, как сказал @GabrielePetronella, нет необходимости использовать интерполяцию строк, когда Stringесть конструктор, который принимает Int. Это гораздо яснее и лаконичнее.
Исуру
58

Вот 4 метода:

var x = 34
var s = String(x)
var ss = "\(x)"
var sss = toString(x)
var ssss = x.description

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

Ян Брэдбери
источник
5
Я просто смотрю некоторые из новых курсов Stanford U по Swift и iOS 8. Ваш var ss = "\(x)"пример - именно то, как они советовали преобразовать двойное число в строку. Который я думал, было легко и здорово.
Markhunte
И больше думать о sass - это действительно плохо.
Ян Брэдбери
2
toString был переименован в String
Джирсон Тавера
1
s теперь (Swift 3.1) String (описывает: x) старый синтаксис приводит к ошибке компилятора.
Мотти Шнеор
3
@MottiShneor Нет, это неправильно. String(describing:)никогда не должен использоваться для чего-то еще, кроме отладки. Это не обычный инициализатор строки.
Эрик Ая
55

В Swift 3.0 :

var value: Int = 10
var string = String(describing: value)
vladiulianbogdan
источник
7
Это не верно. String(describing:)никогда не должен использоваться для чего-то еще, кроме отладки. Это не обычный инициализатор строки.
Эрик Ая
Это все еще не так в Swift 5? @ayaio, если исходить из документации, это не кажется неправильным
Zonily Jame
27

Свифт 4 :

let x:Int = 45
let str:String = String(describing: x)

Developer.Apple.com> String> init (описание :)

Инициализатор String (description :)) является предпочтительным способом преобразования экземпляра любого типа в строку.

Custom String Convertible

введите описание изображения здесь

Хамед Гадириан
источник
3
Результат Необязательно (1)
Harshil Kotecha
11
Это не верно. String(describing:)никогда не должен использоваться для чего-то еще, кроме отладки. Это не обычный инициализатор строки.
Эрик Ая
3
Хамед Гх, Моритц уже дал правильный ответ в том же вопросе, проверьте мой ответ Просто используйте обычный инициализатор String (). Но не давайте это по желанию, сначала разверните. Или, как в вашем примере, используйте ??.
Примерно так
2
@HamedGh Посмотрите на примеры в ссылке, которую вы даете себе. describingМетод здесь , чтобы ... описать его содержание. Это дает описание. Иногда это так же, как преобразование, иногда нет . Дайте необязательно, describingи вы увидите результат ... Это не будет преобразование. Существует простой, выделенный способ преобразования: использование обычного инициализатора String, как объяснено в других ответах. Прочитайте полную страницу, на которую вы ссылаетесь: увидите, что этот метод ищет описания различными способами, некоторые из которых могут дать неправильные результаты, если вы ожидаете точного преобразования ..
Эрик Ая
2
Вы действительно должны удалить описательную часть этого ответа. Преобразование должно выполняться без использования какого-либо имени параметра в конструкторе String.
TimTwoToes
26

Просто для полноты вы также можете использовать:

let x = 10.description

или любое другое значение, которое поддерживает описание.

Майк Лишке
источник
5
Это сработало для меня при попытке показать значение в метке. При других подходах это всегда было Optional (0) вместо 0. Спасибо
Hardcore_Graverobber
11

Свифт 4:

Попытка показать значение в метке без слова Optional () .

здесь x - значение Int, использующее.

let str:String = String(x ?? 0)
Харшил Котеча
источник
3
Нет, String(describing:)никогда не следует использовать для чего-то еще, кроме отладки. Это не обычный инициализатор строки.
Эрик Ая
Привет @ Мориц, так что я могу сделать для удаления необязательного слова? У меня есть значение Int, и чем я хочу напечатать на этикетке
Harshil Kotecha
Просто используйте обычный String()инициализатор. Но не давайте это по желанию, сначала разверните. Или, как в вашем примере, используйте ??. Как это:let str = String(x ?? 0)
Эрик Ая
developer.apple.com/documentation/swift/string/2427941 - я понимаю вашу точку зрения, в чем смысл описания
Харшил Котеча
Это в основном для целей отладки. Вы можете описать имя классов, получить описание экземпляров и т. Д. Но оно никогда не должно использоваться для строк, которые используются в самом приложении.
Эрик Ая
8

Чтобы сэкономить время и нервы в будущем, вы можете сделать расширение Int. Обычно я создаю файл общего кода, в который я помещаю расширения, перечисления и другие забавные вещи. Вот как выглядит код расширения:

extension Int
{
    func toString() -> String
    {
        var myString = String(self)
        return myString
    }
}

Затем, когда вы захотите преобразовать int в строку, вы можете просто сделать что-то вроде:

var myNumber = 0
var myNumberAsString = myNumber.toString()
user2266987
источник
Потенциально глупый вопрос, но должна ли это быть функция или вычисляемая переменная? Я не могу вспомнить, какой Swift обычно использует в этих случаях - это toIntили нет toInt().
Мори Марковиц
1
Чтобы сэкономить время и нервы, просто используйте myNumber.description. Нет необходимости в каких-либо расширениях.
Нью-Йорк
8

в Свифт 3.0 это то , как мы можем преобразовать Intв Stringи StringвInt

//convert Integer to String in Swift 3.0

let theIntegerValue :Int = 123  // this can be var also
let theStringValue :String = String(theIntegerValue)


//convert String to Integere in Swift 3.0


let stringValue : String = "123"
let integerValue : Int = Int(stringValue)!
Кальдера Чанака
источник
1
В последней строке кода, зачем нам восклицательный знак в конце?
Омар Тарик
@OmarTariq, потому что мы явно сообщаем компилятору, что это integerValueтип Int. тогда не может иметь значение ноль для него. поэтому компилятор говорит вам развернуть его. если вы хотите избежать этого, используйте его как let integerValue = Int(stringValue). тогда у тебя не будет проблем. Извините за поздний ответ.
Кальдера
1
@ OmarTariq Развертывание в этом случае может быть очень плохим. Если строка не является числом, это приведет к падению вашего приложения. Вы должны действительно проверить, чтобы убедиться, что это правильно, а не принудительно развернуть его.
Чарли Фиш
7

по какой-то причине принятый ответ не работал для меня. Я пошел с этим подходом:

var myInt:Int = 10
var myString:String = toString(myInt)
bkopp
источник
5

Несколько способов сделать это:

var str1:String="\(23)"
var str2:String=String(format:"%d",234)
Друв Рамани
источник
4

Свифт 2:

var num1 = 4
var numString = "56"
var sum2 = String(num1) + numString
var sum3 = Int(numString)
juanmorillios
источник
2

Я использую этот простой подход

Строка в Int:

 var a = Int()
var string1 = String("1")
a = string1.toInt()

и от Int до String:

var a = Int()
a = 1
var string1 = String()
 string1= "\(a)"
Мурари Парик
источник
2

Конвертировать Unicode Int в String

Для тех, кто хочет преобразовать Int в строку Unicode, вы можете сделать следующее:

let myInteger: Int = 97

// convert Int to a valid UnicodeScalar
guard let myUnicodeScalar = UnicodeScalar(myInteger) else {
    return ""
}

// convert UnicodeScalar to String
let myString = String(myUnicodeScalar)

// results
print(myString) // a

Или в качестве альтернативы:

let myInteger: Int = 97
if let myUnicodeScalar = UnicodeScalar(myInteger) {
    let myString = String(myUnicodeScalar)
}
Suragch
источник
@jvarela, это все еще работает. Я только что проверил это в Xcode 8.2 (Swift 3.0.2). StringИнициализатор может занять UnicodeScalar.
Сурагч
0

Чтобы преобразовать строку в Int

var numberA = Int("10")

Print(numberA) // It will print 10

Чтобы преобразовать Int в строку

var numberA = 10

1-й способ)

print("numberA is \(numberA)") // It will print 10

2-й способ)

var strSomeNumber = String(numberA)

или

var strSomeNumber = "\(numberA)"
Анил Кукадея
источник
0
let a =123456888
var str = String(a)

ИЛИ

var str = a as! String
Amul4608
источник
Ваш второй пример не будет работать с Int.
Джон Монтгомери,
0

В Swift 3.0 вы можете изменить целое число на строку, как указано ниже

let a:String = String(stringInterpolationSegment: 15)

Другой способ

let number: Int = 15
let _numberInStringFormate: String = String(number)

// или любое целое число вместо 15

Дилип Джангид
источник
1
Из ссылки на API "Не вызывайте этот инициализатор напрямую. Он используется компилятором при интерпретации интерполяции строк." Может быть, вы хотите перепроверить, если вы используете его где-нибудь.
Рахул Шарма
0

Я предпочитаю использовать String Interpolation

let x = 45
let string = "\(x)"

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

let text = "\(count) \(count > 1 ? "items" : "item") in the cart. Sum: $\(sum + shippingPrice)"
Роберт Дреслер
источник
0

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

extension Int
{
    var string:String {
        get {
            return String(self)
        }
    }
}

затем вы можете получить строку по методу, который вы только что добавили

var x = 1234
var s = x.string
Лай Ли
источник
-1
let Str = "12"
let num: Int = 0
num = Int (str)
Пауло Силва
источник
-1
let intAsString = 45.description     // "45"
let stringAsInt = Int("45")          // 45
Рой Закай
источник