Konwertuj Int na String w Swift


554

Próbuję dowiedzieć się, jak rzucić Intsię na klasę Stringw Swift.

Wymyślam obejście, używając, NSNumberale chciałbym dowiedzieć się, jak to wszystko zrobić w Swift.

let x : Int = 45
let xNSNumber = x as NSNumber
let xString : String = xNSNumber.stringValue

Odpowiedzi:


961

Konwertowanie Intna String:

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

I odwrotnie - konwersja Stringdo Int:

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

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

Lub jeśli używasz Swift 2 lub 3:

let x: Int? = Int(myString)

2
Podczas gdy to działa, użyj toStringfunkcji pokazanej w odpowiedzi poniżej.
ybakos

2
Intwydaje się, że nie ma toString()metody przynajmniej nie w edycji Xcode 6.2: Widzę, że istnieje toStringmetoda globalna ( nie Int.toString() ), czy ktoś wie przewagę nad używaniem String()konstruktora?
Nilloc,

Zauważ, że String(Int?)pisze „Optional (Int)”, przynajmniej w Swift 2, to nie może być to, co miałeś na myśli. Użyj zamiast tegoInt?.description
Teejay,

Cudownie, ale dla mnie nie działa. Mam opcjonalny Int, a String (myInt) nie będzie się kompilować - twierdzi, że „Int? Nie można przekonwertować na String”. Nie ma dla mnie żadnych metod toString () ani toInt (), ani też stringValue i intValue. Nawet String (myInt!) Powie mi, że nazwa inicjatora została zmieniona na coś takiego jak String (opis: myInt!).
Motti Shneor

9
W przypadku Swift 4 zobacz odpowiedź Hameda Gh poniżej. Prawidłowe użycie toString(describing: x)
David Gay

92

Sprawdź poniższą odpowiedź:

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

45
meh, to brzydkie i niepotrzebne obejście, gdy Stringjuż konstruktor akceptujeInt
Gabriele Petronella

3
co źle to znajdziesz? dlaczego oddałeś głos? @GabrielePetronella
PREMKUMAR

2
to po prostu okropny sposób na osiągnięcie pożądanego rezultatu. Odpowiedź jest jednak technicznie poprawna iz tego powodu nie głosowałem za nią.
Gabriele Petronella,

Nie wydaje mi się, aby było to szczególnie brzydkie, z wyjątkiem tego, że niektóre narzędzia analizujące mogą nie radzić sobie dobrze z interpolacją łańcuchów. W przeciwnym razie, kto wie - może szybciej. Używanie „” + x w Javascript jest zazwyczaj szybsze niż na przykład używanie konstruktora String. Ten przykład jest tylko kilka znaków krótszy, ale z pewnością wolałbym interpolację ciągów w przypadkach, w których konstruujesz zdanie z kilku zmiennych.
Desty

1
Nie odrzuciłbym tej odpowiedzi tylko dlatego, że jest brzydka, ale jak powiedział @GrrielePetronella, nie ma potrzeby używania interpolacji łańcuchów, gdy Stringma konstruktor, który akceptuje an Int. Jest o wiele bardziej jasny i zwięzły.
Isuru

58

Oto 4 metody:

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

Mogę sobie wyobrazić, że niektórzy ludzie będą mieli problem z ss. Ale jeśli chcesz zbudować ciąg zawierający inną treść, dlaczego nie.


5
Właśnie oglądam kilka nowych kursów Stanford U na Swift i iOS 8. Twój var ss = "\(x)"przykład jest dokładnie taki, jak radzili konwersję podwójnego na ciąg znaków. Co uważałem za łatwe i świetne.
markhunte

I więcej myślenia o sassie - to naprawdę źle.
Ian Bradbury

2
Nazwa toString została zmieniona na String
Jirson Tavera

1
s jest teraz (Swift 3.1) Ciąg (opisujący: x) starsza składnia powoduje błąd kompilatora.
Motti Shneor

3
@MottiShneor Nie, to źle. String(describing:)nigdy nie powinien być używany do niczego innego niż debugowanie. To nie jest normalny inicjator String.
Eric Aya,

55

W Swift 3.0 :

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

7
To jest źle. String(describing:)nigdy nie powinien być używany do niczego innego niż debugowanie. To nie jest normalny inicjator String.
Eric Aya

Czy nadal jest źle w Swift 5? @ayaio, bo na podstawie dokumentacji nie wydaje się to błędne
Zonily Jame,

27

Swift 4 :

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

Developer.Apple.com> String> init (opisujące :)

Inicjator String (opisujący :) jest preferowanym sposobem konwersji instancji dowolnego typu na string.

Niestandardowy ciąg kabriolet

wprowadź opis zdjęcia tutaj


3
wynik Opcjonalne (1)
Harshil Kotecha

11
To jest źle. String(describing:)nigdy nie powinien być używany do niczego innego niż debugowanie. To nie jest normalny inicjator String.
Eric Aya

3
Hamed Gh, Morithz już udzieliłem prawidłowej odpowiedzi na to samo pytanie sprawdź moją odpowiedź Wystarczy użyć normalnego inicjatora String (). Ale nie dawaj opcjonalnego, najpierw rozpakuj. Lub, jak w twoim przykładzie, użyj ??. W ten sposób: let str = String (x ?? 0)
Harshil Kotecha

2
@HamedGh Spójrz na przykłady w linku, który sam sobie podajesz. describingMetoda jest tu ... opisać jego zawartość. Daje opis. Czasami jest to to samo, co konwersja, a czasem nie . Podaj opcjonalne, describinga zobaczysz wynik ... To nie będzie konwersja. Istnieje prosty, dedykowany sposób konwersji: użycie normalnego inicjatora String, jak wyjaśniono w innych odpowiedziach. Przeczytaj całą stronę, do której prowadzi link: zobacz, że ta metoda wyszukuje opisy na różne sposoby, z których niektóre dawałyby błędne wyniki, gdybyś spodziewał się dokładnej konwersji.
Eric Aya

2
Naprawdę powinieneś usunąć opisującą część tej odpowiedzi. Konwersji należy dokonać bez użycia nazwy parametru w konstruktorze String.
TimTwoToes 18.02.19

26

Dla kompletności możesz także użyć:

let x = 10.description

lub dowolna inna wartość, która obsługuje opis.


5
To działało dla mnie, gdy próbowałem pokazać wartość na etykiecie. Przy innych podejściach zawsze było Opcjonalne (0) zamiast 0. Dziękuję
Hardcore_Graverobber

11

Swift 4:

Próba pokazania wartości w etykiecie bez słowa Optional () .

tutaj x jest wartością Int używającą.

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

3
Nie. String(describing:)Nigdy nie należy używać do innych celów niż debugowanie. To nie jest normalny inicjator String.
Eric Aya

Witaj @ Moritz, więc co mogę zrobić, aby usunąć opcjonalne słowo? mam wartość Int i chcę wydrukować na etykiecie
Harshil Kotecha

Wystarczy użyć normalnego String()inicjatora. Ale nie dawaj opcjonalnego, najpierw rozpakuj. Lub, jak w twoim przykładzie, użyj ??. W ten sposób:let str = String(x ?? 0)
Eric Aya

developer.apple.com/documentation/swift/string/2427941-init Rozumiem twój punkt widzenia, jaki jest pożytek z opisu
Harshil Kotecha

Jest to głównie do celów debugowania. Możesz opisać nazwy klas, uzyskać opis instancji itp. Nie należy go jednak używać w przypadku ciągów znaków używanych w samej aplikacji.
Eric Aya

8

Aby zaoszczędzić czas i problemy w przyszłości, możesz dokonać rozszerzenia Int. Zwykle tworzę wspólny plik kodu, w którym umieszczam rozszerzenia, wyliczenia i inne zabawne rzeczy. Oto jak wygląda kod rozszerzenia:

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

Później, gdy chcesz przekonwertować int na ciąg, możesz po prostu zrobić coś takiego:

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

Potencjalnie głupie pytanie, ale czy powinna to być funkcja, czy zmienna obliczona? Nie mogę sobie przypomnieć, który z nich korzysta Swift zwykle w takich przypadkach - jest to toIntalbo toInt().
Maury Markowitz,

1
Aby zaoszczędzić trochę czasu i kłopotów, po prostu skorzystaj myNumber.description. Nie ma potrzeby żadnych rozszerzeń.
nig

8

w swift 3.0 możemy w ten sposób przekonwertować Intna Stringi StringnaInt

//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
Dlaczego w ostatnim wierszu kodu potrzebujemy wykrzyknika na końcu?
Omar Tariq

@OmarTariq, ponieważ wyraźnie informujemy kompilator, że integerValuejest to typ Int. wtedy nie może mieć wartości zero. więc kompilator każe ci go rozpakować. jeśli chcesz tego uniknąć, użyj go jak let integerValue = Int(stringValue). wtedy nie dostaniesz problemu. przepraszam za późną odpowiedź.
Chanaka Caldera

1
@OmarTariq Rozpakowywanie w tym przypadku może być naprawdę złe. Jeśli ciąg nie jest liczbą, spowoduje to awarię aplikacji. Naprawdę powinieneś sprawdzić, aby upewnić się, że jest poprawny, a nie wymuszać jego rozpakowanie.
Charlie Fish

7

z jakiegokolwiek powodu zaakceptowana odpowiedź nie działała dla mnie. Wybrałem takie podejście:

var myInt:Int = 10
var myString:String = toString(myInt)

5

Wiele sposobów na zrobienie tego:

var str1:String="\(23)"
var str2:String=String(format:"%d",234)

4

Swift 2:

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

2

używam tego prostego podejścia

Ciąg do Int:

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

i od Int do String:

var a = Int()
a = 1
var string1 = String()
 string1= "\(a)"

2

Konwertuj Unicode Int na String

Dla tych, którzy chcą przekonwertować Int na ciąg Unicode, możesz wykonać następujące czynności:

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

Lub alternatywnie:

let myInteger: Int = 97
if let myUnicodeScalar = UnicodeScalar(myInteger) {
    let myString = String(myUnicodeScalar)
}

@jvarela, To nadal działa. Właśnie przetestowałem go w Xcode 8.2 (Swift 3.0.2). StringInicjator może potrwać UnicodeScalar.
Suragch,


0

Aby przekonwertować ciąg na Int

var numberA = Int("10")

Print(numberA) // It will print 10

Aby ukryć Int w String

var numberA = 10

1. sposób)

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

2. sposób)

var strSomeNumber = String(numberA)

lub

var strSomeNumber = "\(numberA)"


0

W swift 3.0 możesz zmienić liczbę całkowitą na string, jak podano poniżej

let a:String = String(stringInterpolationSegment: 15)

Innym sposobem jest

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

// lub dowolną liczbą całkowitą zamiast 15


1
Z referencji API „Nie wywołuj bezpośrednio tego inicjatora. Jest on używany przez kompilator podczas interpretacji interpolacji ciągów”. Być może chcesz dwukrotnie sprawdzić, czy gdzieś go używasz.
Rahul Sharma

0

Wolę używać interpolacji ciągów

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

Każdy obiekt ma pewną reprezentację ciągu. To upraszcza sprawę. Na przykład, jeśli chcesz utworzyć kilka Stringz wieloma wartościami. Możesz także wykonać dowolną matematykę lub użyć pewnych warunków

let text = "\(count) \(count > 1 ? "items" : "item") in the cart. Sum: $\(sum + shippingPrice)"

0

Jeśli lubisz szybkie rozszerzenie, możesz dodać następujący kod

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

następnie możesz uzyskać ciąg znaków za pomocą właśnie dodanej metody

var x = 1234
var s = x.string


-1
let intAsString = 45.description     // "45"
let stringAsInt = Int("45")          // 45
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.