Swift ile Int'ye Dönüştürme


352

Uygulama temel olarak ilk ve son hız ve zamanı girerek ivmeyi hesaplar ve sonra ivmeyi hesaplamak için bir formül kullanır. Ancak, metin kutularındaki değerler dize olduğundan, bunları tamsayılara dönüştüremiyorum.

@IBOutlet var txtBox1 : UITextField
@IBOutlet var txtBox2 : UITextField
@IBOutlet var txtBox3 : UITextField
@IBOutlet var lblAnswer : UILabel


@IBAction func btn1(sender : AnyObject) {

    let answer1 = "The acceleration is"
    var answer2 = txtBox1
    var answer3 = txtBox2
    var answer4 = txtBox3

7
Denemedim ama belki gibi değerleri verebilirsinizvar answer1 = Int(txtBox1.text)
Daniel

Eğer dize "23.0" varsayalım, o zaman Int ("23.0") atarsanız nil döndürür, bu durumda önce Double / Float'a ve sonra tekrar Int.
Ariven Nadar

Yanıtlar:


326

Temel Fikir, bunun sadece Swift 1.x'te çalıştığını unutmayın ( Swift 2.x'te nasıl çalıştığını görmek için ParaSara'nın cevabına bakın):

    // toInt returns optional that's why we used a:Int?
    let a:Int? = firstText.text.toInt() // firstText is UITextField
    let b:Int? = secondText.text.toInt() // secondText is UITextField

    // check a and b before unwrapping using !
    if a && b {
        var ans = a! + b!
        answerLabel.text = "Answer is \(ans)" // answerLabel ie UILabel
    } else {
        answerLabel.text = "Input values are not numeric"
    }

Swift 4 için güncelleme

...
let a:Int? = Int(firstText.text) // firstText is UITextField
let b:Int? = Int(secondText.text) // secondText is UITextField
...

Teşekkürler bu çalışıyor. Ancak, sayıların da kayan nokta içermesini istediğim için bir sorunum var. Tekrar teşekkürler.
Marwan Qasem

4
Şamandıralara ihtiyacınız varsa (ve gerçekten gerçekten şamandıra değil, Double istiyorsanız), toInt () bunu yapmayacaktır. Uygun bir işlev bulmak için hayal gücünüzü ve mevcut belgelerinizi kullanabilir misiniz?
gnasher729

4
Anladım 'NSString' does not have a member named 'toInt'. Herhangi bir fikir?
Matej

1
NSStringve Stringiki farklı nesnedir ve farklı yöntemlere sahiptir. NSStringadlı bir yöntem vardır.intValue
Byron Coetsee

7
Bu çözüm sadece Swift için doğruydu, Swift2 için değil. Şimdi kullanmalısınız: Int (firstText.text)
gurehbgui

337

Swift 2.0 için Güncelleme Cevabı :

toInt()yöntemine bir hata verilir. Çünkü Swift 2.x'te, .toInt()işlev Dize'den kaldırıldı. Bunun yerine, Int artık bir String kabul eden bir başlatıcıya sahiptir:

let a:Int? = Int(firstText.text)     // firstText is UITextField  
let b:Int? = Int(secondText.text)   // secondText is UITextField

'' İşaretini atladığımda neden hata alıyorum diye sorabilir miyim? Char? Neden 'a' yı isteğe bağlı olarak belirtmem gerekiyor?
Manos Serifios

1
@ManosSerifios bu tartışma yardımcı olabilir: stackoverflow.com/questions/32621022/…
Paraneetharan Saravanaperumal

gerçekten ilişkili değil ancak yapıcı yaklaşımı her zaman tercih edilir ve Int to Strings için daha okunabilir. "\(someInt)"iyi değil String(someInt)okumak çok daha kolay
Honey

Yazdırıyorum Int(firstText.text)!ve hala isteğe bağlı görüyorum. Neden? Açmadım mı?
Bal

Dize olduğunda bu çökecektir nil. Dize, bu durumda olduğu gibi bir kullanıcı arabirimi öğesinden geldiğinde gerçekleşmeyebilir. Ama kazasında önlemek için tek yönlü dizesine varsayılan bir değer eklemektir: let a:Int? = Int(firstText.text ?? "").
Jens

85

myString.toInt() - dize değerini int değerine dönüştürür.

Swift 3.x

Bir dizenin içinde saklanan bir tamsayı varsa, tamsayı yapıcısını kullanarak şu şekilde dönüştürebilirsiniz:

let myInt = Int(textField.text)

Diğer veri türlerinde olduğu gibi (Float ve Double) NSString kullanarak da dönüştürebilirsiniz:

let myString = "556"
let myInt = (myString as NSString).integerValue

1
Bu aslında soruyu cevaplıyor, diğerleri
OP'ye

1
Swift 3 için örnek?
Peter Kreinz

pls, gelecek kuşakların umutsuzluk umuduyla "en son Swift Sürümlerini" açıklığa kavuşturuyor :)
Alex Hall

@aremvee Bir tamsayıyı dize olarak "atamak" mı demek istersiniz? Ve diğer cevapların cevaplamadığı soruya tam olarak ne cevap veriyor?
Alex Hall

31

düzenleme / güncelleme: Xcode 11.4 • Swift 5.2

Lütfen kodu kullanarak yorumları kontrol edin


IntegerField.swift dosya içeriği:

import UIKit

class IntegerField: UITextField {

    // returns the textfield contents, removes non digit characters and converts the result to an integer value
    var value: Int { string.digits.integer ?? 0 }

    var maxValue: Int = 999_999_999
    private var lastValue: Int = 0

    override func willMove(toSuperview newSuperview: UIView?) {
        // adds a target to the textfield to monitor when the text changes
        addTarget(self, action: #selector(editingChanged), for: .editingChanged)
        // sets the keyboard type to digits only
        keyboardType = .numberPad
        // set the text alignment to right
        textAlignment = .right
        // sends an editingChanged action to force the textfield to be updated
        sendActions(for: .editingChanged)
    }
    // deletes the last digit of the text field
    override func deleteBackward() {
        // note that the field text property default value is an empty string so force unwrap its value is safe
        // note also that collection remove at requires a non empty collection which is true as well in this case so no need to check if the collection is not empty.
        text!.remove(at: text!.index(before: text!.endIndex))
        // sends an editingChanged action to force the textfield to be updated
        sendActions(for: .editingChanged)
    }
    @objc func editingChanged() {
        guard value <= maxValue else {
            text = Formatter.decimal.string(for: lastValue)
            return
        }
        // This will format the textfield respecting the user device locale and settings
        text = Formatter.decimal.string(for: value)
        print("Value:", value)
        lastValue = value
    }
}

Bu uzantıları projenize de eklemeniz gerekir:


Uzantılar UITextField.swift dosya içeriği:

import UIKit
extension UITextField {
    var string: String { text ?? "" }
}

Uzantılar Formatter.swift dosyası içeriği:

import Foundation
extension Formatter {
    static let decimal = NumberFormatter(numberStyle: .decimal)
}

Uzantılar NumberFormatter.swift dosya içeriği:

import Foundation
extension NumberFormatter {
    convenience init(numberStyle: Style) {
        self.init()
        self.numberStyle = numberStyle
    }
}

Uzantılar StringProtocol.swift dosya içeriği:

extension StringProtocol where Self: RangeReplaceableCollection {
    var digits: Self { filter(\.isWholeNumber) }
    var integer: Int? { Int(self) }
}

Örnek proje


27

Kullanabilirsiniz NSNumberFormatter().numberFromString(yourNumberString). Harika çünkü if letdönüşümün başarılı olup olmadığını belirlemek için test edebileceğiniz bir isteğe bağlı . Örneğin.

var myString = "\(10)"
if let myNumber = NSNumberFormatter().numberFromString(myString) {
    var myInt = myNumber.integerValue
    // do what you need to do with myInt
} else {
    // what ever error code you need to write
}

Hızlı 5

var myString = "\(10)"
if let myNumber = NumberFormatter().number(from: myString) {
    var myInt = myNumber.intValue
    // do what you need to do with myInt
  } else {
    // what ever error code you need to write
  }

1
Xcode 7 'intValue' ile derlenmeyeceği için bunu sadece 'myNumber.integerValue' olarak değiştirdim. İkincisi Int32 değerindedir
brainray

21

hızlı 4.0

let stringNumber = "123"
let number = Int(stringNumber) //here number is of type "Int?"


//using Forced Unwrapping

if number != nil {         
 //string is converted to Int
}

zorlamalı ciltleme dışında İsteğe Bağlı Ciltleme özelliğini de kullanabilirsiniz.

Örneğin:

  if let number = Int(stringNumber) { 
   // number is of type Int 
  }

14

// Xcode 8.1 ve swift 3.0

Biz de başa Opsiyonel Bağlama tarafından, sadece

let occur = "10"

if let occ = Int(occur) {
        print("By optional binding :", occ*2) // 20

    }

11

In Swift 4.2 ve Xcode 10.1

let string:String = "789"
let intValue:Int = Int(string)!
print(intValue)

let integerValue:Int = 789
let stringValue:String = String(integerValue)
    //OR
//let stringValue:String = "\(integerValue)"
print(stringValue)

İlgili: Int (string)! string nil ise, Int? isteğe bağlı nil olacak ve daha sonra nil
paketini açmak

7

Hızlı 3

En basit ve daha güvenli yol:

@IBOutlet var textFieldA  : UITextField
@IBOutlet var textFieldB  : UITextField
@IBOutlet var answerLabel : UILabel

@IBAction func calculate(sender : AnyObject) {

      if let intValueA = Int(textFieldA),
            let intValueB = Int(textFieldB) {
            let result = intValueA + intValueB
            answerLabel.text = "The acceleration is \(result)"
      }
      else {
             answerLabel.text = "The value \(intValueA) and/or \(intValueB) are not a valid integer value"
      }        
}

Klavye türünü sayı tuşuna ayarlamak için geçersiz değerlerden kaçının:

 textFieldA.keyboardType = .numberPad
 textFieldB.keyboardType = .numberPad

7

Swift 4'te:

extension String {            
    var numberValue:NSNumber? {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        return formatter.number(from: self)
    }
}
let someFloat = "12".numberValue

4

Eğer kullanıcı giriş formu almak ve anlamak daha basit anlamak için eklemek için 2 txt alan var basit bir program yaptık lütfen aşağıdaki kodu bulabilirsiniz.

@IBOutlet weak var result: UILabel!
@IBOutlet weak var one: UITextField!
@IBOutlet weak var two: UITextField!

@IBAction func add(sender: AnyObject) {        
    let count = Int(one.text!)
    let cal = Int(two.text!)
    let sum = count! + cal!
    result.text = "Sum is \(sum)"
}

Bu yardımcı olur umarım.


4

Swift 3.0

Bunu deneyin, her şeyi yaptığım herhangi bir durumu kontrol etmeniz gerekmez, sadece bu işlevi kullanın. Bir şey gönder dize, sayı, kayan nokta, çift, vb. değer olarak bir sayı veya değerinizi dönüştüremiyorsa 0 alırsınız

İşlev:

func getNumber(number: Any?) -> NSNumber {
    guard let statusNumber:NSNumber = number as? NSNumber else
    {
        guard let statString:String = number as? String else
        {
            return 0
        }
        if let myInteger = Int(statString)
        {
            return NSNumber(value:myInteger)
        }
        else{
            return 0
        }
    }
    return statusNumber
}

Kullanımı: kodunda ve dönüştürme kullanımına yukarıdaki işlevini ekleyin let myNumber = getNumber(number: myString) eğer myStringbir numarası vardır veya dize o başka sayı döndürür döndürür0

Örnek 1:

let number:String = "9834"
print("printing number \(getNumber(number: number))")

Çıktı: printing number 9834

Örnek 2:

let number:Double = 9834
print("printing number \(getNumber(number: number))")

Çıktı: printing number 9834

Örnek 3:

let number = 9834
print("printing number \(getNumber(number: number))")

Çıktı: printing number 9834


4

String to Int ve diğer türler için kullanışlıdır

extension String {
        //Converts String to Int
        public func toInt() -> Int? {
            if let num = NumberFormatter().number(from: self) {
                return num.intValue
            } else {
                return nil
            }
        }

        //Converts String to Double
        public func toDouble() -> Double? {
            if let num = NumberFormatter().number(from: self) {
                return num.doubleValue
            } else {
                return nil
            }
        }

        /// EZSE: Converts String to Float
        public func toFloat() -> Float? {
            if let num = NumberFormatter().number(from: self) {
                return num.floatValue
            } else {
                return nil
            }
        }

        //Converts String to Bool
        public func toBool() -> Bool? {
            return (self as NSString).boolValue
        }
    }

Gibi kullanın:

"123".toInt() // 123

3

İnt () ve Swift 2.x hakkında: dönüşümden sonra nil değeri alırsanız, büyük bir sayıya sahip bir dizeyi (örneğin: 1073741824) dönüştürmeye çalışırsanız, bu durumda şunu deneyin:

let bytesInternet : Int64 = Int64(bytesInternetString)!

1
Teşekkür ederim bu benim durumum için çalıştı. Int () benim için 16 basamaklı sayılarla çalışıyordu ancak son zamanlarda başarısız olmaya başladı.
Ryan Boyd

3

En son swift3 bu kod dizeyi int

let myString = "556"
let myInt = Int(myString)

2

Bir dize sayısal olmayan karakterler içerebileceğinden guard, işlemi korumak için a kullanmanız gerekir . Misal:

guard let labelInt:Int = Int(labelString) else {
    return
}

useLabelInt()

2

Geçenlerde de aynı sorunu yaşadım. Aşağıdaki çözüm benim için iş:

        let strValue = "123"
        let result = (strValue as NSString).integerValue

1

Bunu kullan:

// get the values from text boxes
    let a:Double = firstText.text.bridgeToObjectiveC().doubleValue
    let b:Double = secondText.text.bridgeToObjectiveC().doubleValue

//  we checking against 0.0, because above function return 0.0 if it gets failed to convert
    if (a != 0.0) && (b != 0.0) {
        var ans = a + b
        answerLabel.text = "Answer is \(ans)"
    } else {
        answerLabel.text = "Input values are not numberic"
    }

VEYA

UITextField KeyboardType'ınızı XIB veya film şeridinizden DecimalTab olarak yapın ve herhangi bir hesaplama yapmak için if koşullarını kaldırın.

var ans = a + b
answerLabel.text = "Answer is \(ans)"

Klavye türü DecimalPad olduğundan başka 0-9 veya girme şansınız yoktur.

Umarım bu yardım !!


1
//  To convert user input (i.e string) to int for calculation.I did this , and it works.


    let num:Int? = Int(firstTextField.text!);

    let sum:Int = num!-2

    print(sum);

1

Bu benim için çalışıyor

var a:Int? = Int(userInput.text!)

Bu, yorumda verilen çözümden nasıl farklı?
Erik

2
Yorumda verilen çözümde eksik "!" Swift 2 ve sonrasında beklenen sonunda
Naishta

1

Swift3.x için

extension String {
    func toInt(defaultValue: Int) -> Int {
        if let n = Int(self.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)) {
            return n
        } else {
            return defaultValue
        }
    }
}

0

Alternatif çözüm için. Uzantıyı yerel bir tür kullanabilirsiniz. Oyun alanı ile test edebilirsiniz.

extension String {
    func add(a: Int) -> Int? {
        if let b = Int(self) {
            return b + a
        }
        else {
            return nil
        }
    }     
}

"2" .Add (1)


0

Benim çözüm dizeden int dönüşümü için genel bir uzantısı olması.

extension String {

 // default: it is a number suitable for your project if the string is not an integer

    func toInt(default: Int) -> Int {
        if let result = Int(self) {
            return result
        }
        else {
            return default  
        }
    }

}

0
@IBAction func calculateAclr(_ sender: Any) {
    if let addition = addition(arrayString: [txtBox1.text, txtBox2.text, txtBox3.text]) {
      print("Answer = \(addition)")
      lblAnswer.text = "\(addition)"
    }
}

func addition(arrayString: [Any?]) -> Int? {

    var answer:Int?
    for arrayElement in arrayString {
        if let stringValue = arrayElement, let intValue = Int(stringValue)  {
            answer = (answer ?? 0) + intValue
        }
    }

    return answer
}

0

Soru: string "4.0000" Int ("4.000") kullanılarak tamsayıya dönüştürülemiyor?

Cevap: Int () kontrol dizesi tamsayıdır veya evet ise, o zaman size tamsayı verir ve aksi halde nil. ancak Float veya Double, herhangi bir sayı dizesini nil vermeden ilgili Float veya Double'e dönüştürebilir. Örneğin "45" tamsayı dizeniz varsa ancak Float ("45") kullanmak size 45.0 float değeri verirken Double ("4567") kullanmak size 45.0 verir.

Çözüm: NSString (dize: "45.000"). İntegerValue veya Int (Kayan ("45.000")!)! doğru sonuç almak için.


0

Swift'te bir Int, bir String kabul eden bir başlatıcı içerir. İsteğe bağlı bir Int? dize bir sayı içermiyorsa dönüşüm başarısız olabilir.

Bir if let ifadesi kullanarak dönüşümün başarılı olup olmadığını doğrulayabilirsiniz.

Böylece kodunuz şöyle bir şey haline gelir:

@IBOutlet var txtBox1 : UITextField
@IBOutlet var txtBox2 : UITextField
@IBOutlet var txtBox3 : UITextField
@IBOutlet var lblAnswer : UILabel

@IBAction func btn1(sender : AnyObject) {

    let answer1 = "The acceleration is"
    var answer2 = txtBox1
    var answer3 = txtBox2
    var answer4 = txtBox3

    if let intAnswer = Int(txtBox1.text) {
      // Correctly converted
    }
}

0

Swift 5.0 ve Üstü

Çalışma

Eğer bölüyorsanız, Stringiki substringsdeğil iki oluşturur Strings. Bu, aşağıdaki yöntemi kontrol eder Anyve onu T0 dönüştürmek NSNumberbir dönüştürme Kolay NSNumberiçin Int,Float şimdiye kadar veri ne tür bir ihtiyaç.

Gerçek Kod

//Convert Any To Number Object Removing Optional Key Word.
public func getNumber(number: Any) -> NSNumber{
 guard let statusNumber:NSNumber = number as? NSNumber  else {
    guard let statString:String = number as? String else {
        guard let statSubStr : Substring = number as? Substring else {
            return 0
        }
        if let myInteger = Int(statSubStr) {
            return NSNumber(value:myInteger)
        }
        else{
            return 0
        }
    }

    if let myInteger = Int(statString) {
        return NSNumber(value:myInteger)
    }
    else if let myFloat = Float(statString) {
        return NSNumber(value:myFloat)
    }else {
        return 0
    }
}
return statusNumber }

kullanım

if let hourVal = getNumber(number: hourStr) as? Int {

}

StringKontrol etmek ve dönüştürmek için geçiyorDouble

Double(getNumber(number:  dict["OUT"] ?? 0)

0

İnt için Swift5 float veya int dizesi:

extension String {
    func convertStringToInt() -> Int {
        return Int(Double(self) ?? 0.0)
    }
}

let doubleStr = "4.2"
// print 4
print(doubleStr.convertStringToInt())

let intStr = "4"
// print 4
print(intStr.convertStringToInt())

-1

İtibariyle Swift 3 , benim #% zorlamak zorunda @! dize & int ile "!" aksi takdirde çalışmaz.

Örneğin:

let prefs = UserDefaults.standard
var counter: String!
counter = prefs.string(forKey:"counter")
print("counter: \(counter!)")


var counterInt = Int(counter!)
counterInt = counterInt! + 1
print("counterInt: \(counterInt!)")

OUTPUT:
counter: 1
counterInt: 2

Sadece yapamaz var counterInt = counter.map { Int($0) }mısın? Nerede counterolabilirString?
Martin

@Martin - Hayır? isteğe bağlı yapar ve böylece sayaç dizesine "isteğe bağlı" kelimesini ekler.
Sam B

IMHO, seçeneklerinizi açmaya zorlamamalısınız. Kullanım guardve if letaçıklamaları tercih et
Martin

-1

Swift 4'te Dize değerini Tamsayıya Dönüştür

let strValue:String = "100"
let intValue = strValue as! Int
var intValueFromString:Int = strValue as! Int
or
var intValueFromString = Int(strValue)!
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.