Convirtiendo String en Int con Swift

La aplicación básicamente calcula la aceleración ingresando la velocidad y el tiempo inicial y final y luego usa una fórmula para calcular la aceleración. Sin embargo, dado que los valores en los cuadros de texto son de cadena, no puedo convertirlos a enteros.

@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 

Idea básica, tenga en cuenta que esto solo funciona en Swift 1.x (consulte la respuesta de ParaSara para ver cómo funciona en Swift 2.x):

  // 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" } 

Actualización para Swift 4

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

Actualizar respuesta para swift 2.0 :

toInt() método toInt() recibe un error. Porque, en Swift 2.x, la función .toInt() se eliminó de String. En reemplazo, Int ahora tiene un inicializador que acepta una cadena:

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

myString.toInt() – convierte el valor de cadena en int.

Swift 3.x

Si tiene un entero oculto dentro de una cadena, puede convertir utilizando el constructor del entero, así:

 let myInt = Int(textField.text) 

Al igual que con otros tipos de datos (Float y Double), también puede convertir utilizando NSString:

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

Xcode 8.3.2 • Swift 3.1

 class IntegerField: UITextField { var integer: Int { return string.digits.integer } override func willMove(toSuperview newSuperview: UIView?) { addTarget(self, action: #selector(editingChanged), for: .editingChanged) keyboardType = .numberPad textAlignment = .right editingChanged() } func editingChanged() { text = Formatter.decimal.string(for: integer) print(integer) } } 

Extensiones necesarias, estructuras e inicializadores:

 extension Sequence where Iterator.Element == UnicodeScalar { var string: String { return String(String.UnicodeScalarView(self)) } } extension Formatter { static let decimal = NumberFormatter(numberStyle: .decimal) } extension UITextField { var string: String { return text ?? "" } } extension String { private static var digitsPattern = UnicodeScalar("0")..."9" var digits: String { return unicodeScalars.filter { String.digitsPattern ~= $0 }.string } var integer: Int { return Int(self) ?? 0 } } extension NumberFormatter { convenience init(numberStyle: Style) { self.init() self.numberStyle = numberStyle } } 

NSNumberFormatter().numberFromString(yourNumberString) utilizar NSNumberFormatter().numberFromString(yourNumberString) . Es genial porque devuelve un parámetro opcional que luego puede probar con un “if let” para determinar si la conversión fue exitosa. p.ej.

  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 } 

// Xcode 8.1 y swift 3.0

También podemos manejarlo mediante enlace opcional, simplemente

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

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

también podría usar Enlace opcional distinto al enlace forzado.

p.ej:

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

Swift 3

La forma más simple y segura es:

 @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" } } 

Evite los valores no válidos configurando el tipo de teclado en el teclado numérico:

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

En Swift 4:

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

He hecho un progtwig simple, donde tienes 2 campos de texto txt, tomas la forma de entrada del usuario y los agregas para que sea más fácil de entender, encuentra el código a continuación.

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

espero que esto ayude.

Acerca de int () y Swift 2.x: si obtiene un valor nulo después de la conversión, compruebe si intenta convertir una cadena con un número grande (por ejemplo: 1073741824); en este caso, intente:

 let bytesInternet : Int64 = Int64(bytesInternetString)! 

Swift 3.0

Intente esto, no necesita verificar si hay alguna condición. He hecho todo solo uso esta función. Envía cualquier cadena, número, flotador, doble, etc. obtienes un número como valor o 0 si no puede convertir tu valor

Función:

 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 } 

Uso: Agregue la función anterior en el código y para convertir utilice let myNumber = getNumber(number: myString) si myString tiene un número o cadena, devuelve el número, de lo contrario, devuelve 0

Ejemplo 1:

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

Salida: printing number 9834

Ejemplo 2:

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

Salida: printing number 9834

Ejemplo 3:

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

Salida: printing number 9834

Último swift3 este código es simplemente para convertir cadena a int

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

Utilizar esta:

 // 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" } 

O

Haga que su UITextField KeyboardType sea DecimalTab de su XIB o guión gráfico, y elimine cualquier condición if para hacer cualquier cálculo, es decir.

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

Como el tipo de teclado es DecimalPad, no hay posibilidad de ingresar otro 0-9 o.

Espero que esto ayude !!

 // To convert user input (ie string) to int for calculation.I did this , and it works. let num:Int? = Int(firstTextField.text!); let sum:Int = num!-2 print(sum); 

Esto funciona para mí

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

Debido a que una cadena puede contener caracteres no numéricos, debe usar un guard para proteger la operación. Ejemplo:

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

En Swift 2.x, la función .toInt () se eliminó de String. En reemplazo, Int ahora tiene un inicializador que acepta una cadena

Int (myString)

En su caso, podría usar Int (textField.text!) Insted de textField.text! .ToInt ()

Swift 1.x

 let myString: String = "256" let myInt: Int? = myString.toInt() 

Swift 2.x, 3.x

 let myString: String = "256" let myInt: Int? = Int(myString) 

para una solución alternativa. Puede usar la extensión como un tipo nativo. Puedes probar con el patio de juegos.

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

“2” .add (1)

Mi solución es tener una extensión general para la conversión de cadena a int.

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

para Swift3.x

 extension String { func toInt(defaultValue: Int) -> Int { if let n = Int(self.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)) { return n } else { return defaultValue } } } 
 @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 } 

A partir del swift 3 , tengo que forzar mi #% @! string & int con un “!” de lo contrario, simplemente no funciona.

Por ejemplo:

 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 

Pregunta: la cadena “4.0000” no se puede convertir a un entero usando Int (“4.000”)?

Respuesta: La cadena de verificación Int () es entera o no si sí, entonces da tu entero y de otra forma nulo. pero Flotante o Doble puede convertir cualquier cadena de números a Flotante o Doble respectivo sin dar nulo. Ejemplo si tiene una cadena entera de “45”, pero si usa Float (“45”) le da 45.0 de valor flotante o si usa Double (“4567”) le da 45.0.

Solución: NSString (cadena: “45.000”). IntegerValue o Int (Float (“45.000”)!)! para obtener el resultado correcto

Recientemente tuve el mismo problema. La siguiente solución es trabajo para mí:

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