Convertendo String para Int com Swift

O aplicativo basicamente calcula a aceleração inserindo a velocidade inicial e final e o tempo e, em seguida, usa uma fórmula para calcular a aceleração. No entanto, como os valores nas checkboxs de texto são string, não consigo convertê-los em números inteiros.

@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 

Idéia básica, note que isso só funciona no Swift 1.x (confira a resposta do ParaSara para ver como ele funciona no 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" } 

Atualização para o Swift 4

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

Resposta de atualização para swift 2.0 :

toInt() método é dado um erro. Porque, no Swift 2.x, a function .toInt() foi removida do String. Em substituição, Int agora tem um inicializador que aceita uma String:

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

myString.toInt() – converte o valor da string em int.

Swift 3.x

Se você tem um inteiro escondido dentro de uma string, você pode convertê-lo usando o construtor do inteiro, assim:

 let myInt = Int(textField.text) 

Como com outros tipos de dados (Float e Double), você também pode converter usando 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) } } 

Extensões, estruturas e inicializadores necessários:

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

Você quer usar NSNumberFormatter().numberFromString(yourNumberString) . É ótimo porque ele retorna um opcional que você pode testar com um “se deixar” para determinar se a conversão foi bem-sucedida. por exemplo.

  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 e Swift 3.0

Nós também podemos lidar com isso por binding opcional, simplesmente

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

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

Você também pode usar Ligação Opcional diferente da binding forçada.

por exemplo:

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

Swift 3

A maneira mais simples e segura é:

 @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 valores inválidos configurando o tipo de teclado no teclado numérico:

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

No Swift 4:

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

Eu fiz um programa simples, onde você tem 2 campos de texto que você toma forma de input do usuário e adicioná-los para torná-lo mais fácil de entender, por favor, encontrar o código abaixo.

 @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 isto ajude.

Sobre int () e Swift 2.x: se você obtiver um valor nulo após a verificação de conversão, se tentar converter uma cadeia com um número grande (por exemplo: 1073741824), neste caso, tente:

 let bytesInternet : Int64 = Int64(bytesInternetString)! 

Swift 3.0

Tente isso, você não precisa verificar qualquer condição que eu fiz tudo apenas usar esta function. Envie qualquer coisa string, number, float, double, etc ,. você obtém um número como um valor ou 0 se não conseguir converter seu valor

Função:

 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: Adicione a function acima no código e para converter use let myNumber = getNumber(number: myString) se o myString tiver um número ou string ele retorna o número que ele retorna 0

Exemplo 1:

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

Saída: printing number 9834

Exemplo 2:

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

Saída: printing number 9834

Exemplo 3:

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

Saída: printing number 9834

Últimas swift3 este código é simplesmente converter string para int

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

Usa isto:

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

OU

Faça o seu UITextField KeyboardType como DecimalTab do seu XIB ou storyboard, e remova qualquer condição para fazer qualquer cálculo, por exemplo.

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

Como o tipo de teclado é DecimalPad, não há chance de inserir outros 0-9 ou.

Espero que esta ajuda !!

 // 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); 

Isso funciona para mim

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

Como uma string pode conter caracteres não numéricos, você deve usar uma guard para proteger a operação. Exemplo:

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

No Swift 2.x, a function .toInt () foi removida do String. Em substituição, Int agora tem um inicializador que aceita uma String

Int (myString)

No seu caso, você poderia 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 solução alternativa. Você pode usar a extensão de um tipo nativo. Você pode testar com playground.

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

“2” .add (1)

Minha solução é ter uma extensão geral para string para conversão 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 de 3 , tenho que forçar meu #% @! string & int com um “!” caso contrário, simplesmente não funciona.

Por exemplo:

 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 

Pergunta: string “4.0000” não pode ser convertido em inteiro usando Int (“4.000”)?

Resposta: Int () seqüência de verificação é inteiro ou não, se sim, em seguida, dar-lhe inteiro e de outra forma nula. mas Float ou Double podem converter qualquer string numérica para o respectivo Float ou Double sem dar nil. Exemplo, se você tiver uma string inteira “45”, mas usar Float (“45”) lhe der o valor 45.0 float ou usar Double (“4567”), você terá 45.0.

Solução: NSString (string: “45.000”). IntegerValue ou Int (Float (“45.000”)!)! para obter o resultado correto.

Eu comecei recentemente o mesmo problema. Abaixo solução é trabalho para mim:

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