Приложение в основном вычисляет ускорение путем ввода начальной и конечной скорости и времени, а затем использует формулу для расчета ускорения. Однако, поскольку значения в текстовых полях являются строками, я не могу преобразовать их в целые числа.
@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
Основная идея, обратите внимание, что это работает только в Swift 1.x (проверьте ParaSara ответ, чтобы увидеть, как он работает в Swift 2.x):
// toInt returns optional that 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
...
let a:Int? = Int(firstText.text) // firstText is UITextField
let b:Int? = Int(secondText.text) // secondText is UITextField
...
Обновить ответ для swift 2.0:
toInt()
задана ошибка. Поскольку в Swift 2.x функция .toInt()
была удалена из String. Взамен Int теперь имеет инициализатор, который принимает строку:
let a:Int? = Int(firstText.text) // firstText is UITextField
let b:Int? = Int(secondText.text) // secondText is UITextField
myString.toInt()
- преобразовать значение строки в int.
Swift 3.x
Если у вас есть целое число, скрывающееся внутри строки, вы можете преобразовать с помощью целочисленного конструктора, например:
let myInt = Int(textField.text)
Как и в случае с другими типами данных (Float и Double), вы также можете конвертировать с помощью 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)
}
}
Требуемые расширения, структуры и инициализаторы:
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)
. Это здорово, потому что он возвращает необязательный вариант, который вы затем можете проверить с помощью "if let", чтобы определить, было ли преобразование успешным.
например.
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
}
быстрый 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
}
вы также можете использовать опциональную привязку, кроме принудительной привязки.
например:
if let number = Int(stringNumber) {
// number is of type Int
}
//Xcode 8.1 и swift 3.0
Мы также можем обрабатывать его с помощью необязательного привязки, просто
let occur = "10"
if let occ = Int(occur) {
print("By optional binding :", occ*2) // 20
}
Swift 3
Самый простой и безопасный способ:
@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"
}
}
Избегайте недопустимых значений, задающих тип клавиатуры для цифровой клавиатуры:
textFieldA.keyboardType = .numberPad
textFieldB.keyboardType = .numberPad
В Swift 4:
extension String {
var numberValue:NSNumber? {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
return formatter.number(from: self)
}
}
let someFloat = "12".numberValue
Я сделал простую программу, в которой у вас есть 2 поля txt, которые вы вводите в форму пользователя и добавляете их, чтобы упростить понимание, пожалуйста, найдите код ниже.
@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)"
}
надеюсь, что это поможет.
В Swift 4.2 и 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)
Последний swift3, этот код просто преобразует строку в int
let myString = "556"
let myInt = Int(myString)
Swift 3.0
Попробуйте это, вам не нужно проверять какое-либо условие, которое я сделал, просто использую эту функцию. Отправить что-нибудь строку, число, float, double и т.д. вы получаете число как значение или 0, если оно неспособно преобразовать ваше значение
Функция:
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
}
Применение:
Добавьте вышеприведенную функцию в код и для конвертирования
let myNumber = getNumber(number: myString)
если myString
имеет число или строку, он возвращает число else, которое возвращает 0
Пример 1:
let number:String = "9834"
print("printing number \(getNumber(number: number))")
Выход: printing number 9834
Пример 2:
let number:Double = 9834
print("printing number \(getNumber(number: number))")
Выход: printing number 9834
Пример 3:
let number = 9834
print("printing number \(getNumber(number: number))")
Выход: printing number 9834
О int() и Swift 2.x: если вы получите значение nil после проверки конверсии, если вы попытаетесь преобразовать строку с большим числом (например: 1073741824), в этом случае попробуйте:
let bytesInternet : Int64 = Int64(bytesInternetString)!
Поскольку строка может содержать нечисловые символы, вы должны использовать guard
для защиты операции. Пример:
guard let labelInt:Int = Int(labelString) else {
return
}
useLabelInt()
В Swift 2.x функция.toInt() была удалена из String. Взамен Int теперь имеет инициализатор, который принимает строку
Int (туЗЬптд)
В вашем случае вы можете использовать Int (textField.text!) Insted 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)
для Swift3.x
extension String {
func toInt(defaultValue: Int) -> Int {
if let n = Int(self.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)) {
return n
} else {
return defaultValue
}
}
}
// 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);
Это работает для меня
var a:Int? = Int(userInput.text!)
Используйте это:
// 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"
}
ИЛИ
Сделайте свой UITextField KeyboardType как DecimalTab из вашего XIB или раскадровки и удалите любое условие if для любого вычисления, т.е.
var ans = a + b
answerLabel.text = "Answer is \(ans)"
Поскольку тип клавиатуры - DecimalPad, нет возможности ввести другие 0-9 или.
Надеюсь на эту помощь!
let strValue:String = "100"
let intValue = strValue as! Int
var intValueFromString:Int = strValue as! Int
or
var intValueFromString = Int(strValue)!
Я недавно получил ту же проблему. Ниже приведена работа для меня:
let strValue = "123"
let result = (strValue as NSString).integerValue
Вопрос: строка "4.0000" не может быть преобразована в целое число с использованием Int ("4.000")?
Ответ: строка проверки Int() является целым числом или нет, если да, то дайте целое число и в противном случае значение nil. но Float или Double могут преобразовывать любую строку чисел в соответствующий Float или Double без указания нулевого значения. Пример, если у вас есть целая строка "45", но с использованием Float ("45") дает вам значение с плавающей запятой 45,0 или с помощью Double ("4567") дает вам 45,0.
Решение: NSString (строка: "45.000"). IntegerValue или Int (Float ("45.000")!)! чтобы получить правильный результат.
Как и у swift 3, мне нужно заставить мой #% @! string и int с "!" иначе он просто не работает.
Например:
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
var counterInt = counter.map { Int($0) }
? Если counter
whould быть String?
@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
}
Мое решение состоит в том, чтобы иметь общее расширение для преобразования строки в 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
}
}
}
для альтернативного решения. Вы можете использовать расширение родного типа. Вы можете протестировать с детской площадкой.
extension String {
func add(a: Int) -> Int? {
if let b = Int(self) {
return b + a
}
else {
return nil
}
}
}
"2".add(1)
var answer1 = Int(txtBox1.text)