Перетворити 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функцію, показану у відповіді нижче.
ybakos

2
Intне здається, що toString()метод має, принаймні, не в Xcode 6.2 edit: я бачу, що існує глобальний toStringметод ( немає Int.toString() ), хтось знає перевагу перед використанням String()конструктора?
Nilloc

Зауважте, що String(Int?)написано "Необов’язково (Int)", принаймні у Swift 2, це не могло бути тим, що ви мали на увазі. Використовуйте замість цьогоInt?.description
Teejay

Чудово, але не працює для мене. У мене необов'язковий компіляція Int, а String (myInt) - він стверджує, що "Int? Не може бути перетворений у String". Для мене немає жодних методів toString () або toInt (), або stringValue та intValue відсутні. Навіть String (myInt!) Скаже мені, що ініціалізатор був перейменований на щось на зразок String (описуючи: myInt!).
Motti Shneor

9
Щодо Swift 4, див. Відповідь Хамеда Gh нижче. Правильне використанняString(describing: x)
David Gay

92

Перевірте нижче відповідь:

let x : Int = 45
var stringValue = "\(x)"
print(stringValue)

45
Мех, це потворне і непотрібне рішення, коли Stringконструктор вже приймаєInt
Габріеле Петронелла,

3
що не так ви знаходите? чому ти виставив голос? @GabrielePetronella
PREMKUMAR

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

І більше думати про сас - це справді погано.
Ян Бредбері

2
toString було перейменовано на String
Jirson Tavera

1
s зараз (Swift 3.1) Рядок (описуючи: x) старший синтаксис призводить до помилки компілятора.
Motti Shneor

3
@MottiShneor Ні, це неправильно. String(describing:)ніколи не слід використовувати ні для чого іншого, ніж налагодження. Це не звичайний ініціалізатор String.
Ерік Айя

55

У Swift 3.0 :

var value: Int = 10
var string = String(describing: value)

7
Це неправильно. String(describing:)ніколи не слід використовувати ні для чого іншого, ніж налагодження. Це не звичайний ініціалізатор String.
Ерік Айя

Це все ще неправильно у Swift 5? @ayaio, тому що, виходячи з документації, це не здається неправильним
Zonily Jame

27

Швидкий 4 :

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

Developer.Apple.com> Рядок> init (описує :)

Строковий (описуючи :) ініціалізатор :) є кращим способом перетворення екземпляра будь-якого типу в рядок.

Спеціальні рядкові кабріолети

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


3
результат Необов’язково (1)
Харшил Котеча

11
Це неправильно. String(describing:)ніколи не слід використовувати ні для чого іншого, ніж налагодження. Це не звичайний ініціалізатор String.
Ерік Айя

3
Hamed Gh, Моріц вже дав правильну відповідь у тому ж запитанні перевірити мою відповідь. Просто використовуйте звичайний ініціалізатор String (). Але не давайте це додатково, розгортайте спочатку. Або, як у вашому прикладі, використовуйте ??.
Ось так

2
@HamedGh Подивіться приклади за посиланням, яке ви даєте самі. describingМетод тут , щоб ... описати його зміст. Це дає опис. Іноді це те саме, що перетворення, іноді ні . Надайте необов'язково, describingі ви побачите результат ... Це не буде конверсією. Існує простий, виділений спосіб перетворення: використання звичайного ініціалізатора String, як пояснено в інших відповідях. Прочитайте повну сторінку, на яку ви посилаєтесь: перегляньте, що цей метод шукає описи різними способами, деякі з яких дадуть неправильні результати, якщо ви очікуєте точної конверсії ..
Ерік Айя

2
Вам дійсно слід видалити описову частину цієї відповіді. Перетворення слід проводити без використання імені параметра в конструкторі String.
TimTwoToes

26

Для повноти ви також можете використовувати:

let x = 10.description

або будь-яке інше значення, яке підтримує опис.


5
Це працювало для мене, коли я намагався показати значення в етикетці. З іншими підходами це було завжди необов’язково (0) замість 0. Дякую
Hardcore_Graverobber

11

Швидкий 4:

Намагання показати значення в мітці без необов’язкового () слова.

тут x - значення Int.

let str:String = String(x ?? 0)

3
Ні. String(describing:)Ніколи не слід використовувати ні для чого іншого, ніж налагодження. Це не звичайний ініціалізатор String.
Ерік Айя

Привіт @Moritz. Що я можу зробити для видалення необов’язкового слова? я маю значення Int і чим я хочу надрукувати етикеткою
Харшил Котеча

Просто використовуйте звичайний String()ініціалізатор. Але не давайте це додатково, розгортайте спочатку. Або, як у вашому прикладі, використовувати ??. Ось так:let str = String(x ?? 0)
Ерік Айя

developer.apple.com/documentation/swift/string/2427941-init я розумію, у чому полягає користь опису
Харшил Котеча

Це здебільшого для налагодження. Ви можете описати назву класів, отримати опис примірників тощо. Але вона ніколи не повинна використовуватися для рядків, які використовуються в самому додатку.
Ерік Айя

8

Щоб заощадити собі час і клопоти в майбутньому, ви можете зробити розширення Int. Зазвичай я створюю спільний файл коду, куди розміщую розширення, перерахунки та інші цікаві речі. Ось як виглядає код розширення:

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

Потім пізніше, коли ви хочете перетворити int в рядок, ви можете просто зробити щось на кшталт:

var myNumber = 0
var myNumberAsString = myNumber.toString()

Потенційно дурне питання, але чи це повинна бути функція чи обчислена змінна? Я не можу пригадати , який з них Swift зазвичай використовується в таких випадках - це його toIntабо toInt().
Maury Markowitz

1
Щоб заощадити собі трохи часу і клопоту, просто використовуйте myNumber.description. Не потрібно ніяких розширень.
nyg

8

в swift 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)


4

Швидкий 2:

var num1 = 4
var numString = "56"
var sum2 = String(num1) + numString
var sum3 = Int(numString)

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)
}

@jvarela, це все ще працює. Я щойно перевірив це в Xcode 8.2 (Swift 3.0.2). StringІніціалізатор може зайняти UnicodeScalar.
Сурагч


0

Для перетворення String в Int

var numberA = Int("10")

Print(numberA) // It will print 10

Щоб приховати Int у String

var numberA = 10

1-й спосіб)

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

2-й спосіб)

var strSomeNumber = String(numberA)

або

var strSomeNumber = "\(numberA)"


0

У swift 3.0 ви можете змінити ціле число на рядок, як зазначено нижче

let a:String = String(stringInterpolationSegment: 15)

Інший спосіб

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

// або будь-яке ціле число замість 15


1
З посилання API "Не викликайте цей ініціалізатор безпосередньо. Він використовується компілятором при інтерпретації рядкових інтерполяцій." Можливо, ви хочете перевірити, чи використовуєте ви його десь.
Рахул Шарма

0

Я вважаю за краще використовувати строкову інтерполяцію

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.