该应用程序基本上通过输入初始速度和最终速度以及时间来计算加速度,然后使用公式来计算加速度。但是,由于文本框中的值是字符串,所以我无法将它们转换为整数。

@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


评论

没有尝试过,但是也许您可以像var answer1 = Int(txtBox1.text)
那样转换值
如果字符串假定为“ 23.0”,则如果将其强制转换为Int(“ 23.0”),它将返回nil,在这种情况下,您首先需要强制转换为Double / Float,然后再次强制转换为Int。

#1 楼

基本概念,请注意,这仅在Swift 1.x中有效(请查看ParaSara的答案以了解在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"
    }


Swift的更新4

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


评论


谢谢你的作品。但是,我有一个问题,因为我也希望数字也包含浮点数。再次感谢。

– Marwan Qasem
2014年6月12日18:15



如果您需要浮点数(并且您确实真的想要Double,而不是浮点数),则toInt()不会这样做。您能否利用您的想象力和可用的文档来找到合适的功能?

– gnasher729
14年6月13日在7:18

我得到“ NSString”没有名为“ toInt”的成员。有任何想法吗?

–马泰
2014年11月4日,11:16

NSString和String是两个不同的对象,并且具有不同的方法。 NSString有一个称为.intValue的方法

–拜伦·库茨(Byron Coetsee)
15年1月22日在12:24

此解决方案仅适用于Swift,不适用于Swift2。现在您应该使用:Int(firstText.text)

– gurehbgui
2015年9月27日在10:36

#2 楼

Swift 2.0+的更新答案:
toInt()方法给出了错误,因为它已从Swift 2.x中的String中删除。相反,Int类型现在具有一个接受String的初始化程序:
let a: Int? = Int(firstTextField.text)
let b: Int? = Int(secondTextField.text)


评论


我可以问为什么我省略'时会出错吗?炭?为什么我需要声明“ a”为可选?

– Manos Serifios
16年6月2日在20:16



@ManosSerifios的讨论可能会有所帮助:stackoverflow.com/questions/32621022/…

– Paraaneetharan Saravanaperumal
16年3月3日在5:36

并不是真正相关的,但是对于Int to Strings而言,构造方法始终是首选并且更具可读性。 “ \(someInt)”不好String(someInt)更容易阅读

–蜂蜜
16-09-30在16:09

我正在打印Int(firstText.text)!然后我仍然看到可选的为什么?我没有拆开吗?

–蜂蜜
16年11月22日在17:50

字符串为nil时,这将崩溃。当字符串来自UI元素(在这种情况下)时,可能不会发生。但是,防止崩溃的一种方法是在字符串中添加默认值:let a:Int? = Int(firstText.text ??“”)。

–詹斯
17年12月8日在14:14

#3 楼

myString.toInt()-将字符串值转换为int。

Swift 3.x

如果字符串中隐藏了整数,则可以使用整数的构造函数进行转换,如下所示:

let myInt = Int(textField.text)


与其他数据类型(浮点和双精度)一样,您也可以使用NSString进行转换:

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


评论


这实际上回答了这个问题,其他所有人都告诉OP如何将Integer作为String进行惯性运动,这不是他要的。

–天堂
15年7月8日在12:19

例如Swift 3?

– Peter Kreinz
16年3月3日在10:18

请澄清“最新的Swift版本”,以防止后代感到困惑:)

–亚历克斯·霍尔
17年7月3日在21:44

@aremvee的意思是“整数”字符串吗?而这究竟是什么回答了其他答案没有的问题呢?

–亚历克斯·霍尔
17年7月3日在21:46

#4 楼

编辑/更新:Xcode 11.4•Swift 5.2

请通过代码检查注释


IntegerField.swift文件内容:

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



您还需要将这些扩展名添加到您的项目中:


扩展UITextField.swift文件的内容:

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



扩展Formatter.swift文件内容:

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




扩展NumberFormatter.swift文件内容:

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



扩展名StringProtocol.swift文件内容:

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



示例项目

#5 楼

您可以使用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
}


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


评论


我只是将其更改为“ myNumber.integerValue”,因为Xcode 7不会使用“ intValue”构建。后者具有Int32值

–brainray
2015年6月9日在11:39

#6 楼

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
}


除了强制绑定之外,您还可以使用可选绑定。

例如:

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


#7 楼

// Xcode 8.1和swift 3.0

我们也可以通过可选绑定来处理它,只需

let occur = "10"

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

    }


#8 楼

在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)


评论


关于:诠释(字符串)!如果字符串为零,诠释?可选将为nil,然后解开nil可选将导致崩溃

– jcpennypincher
6月16日,0:28



@ jcpennypincher,您能否更新答案。或发布新答案,对其他人有帮助。谢谢。

– iOS
6月30日6:30

#9 楼

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


#10 楼

在Swift 4中:

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


#11 楼

我做了一个简单的程序,在这里您有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)"
}


希望有帮助。

#12 楼

Swift 3.0

尝试一下,您不需要检查任何条件,只要使用此功能,我就可以完成所有操作。发送任何字符串,数字,浮点数,双精度等。您将获得一个数字作为值,如果无法转换您的值,则会得到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有数字或字符串,则返回数字,否则返回0

示例1:

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


输出:printing number 9834


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

#13 楼

对于将String转换为Int和其他类型有用

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


使用它的方式如下:

"123".toInt() // 123


#14 楼

关于int()和Swift 2.x:如果在转换后得到nil值,请检查是否尝试转换具有大数字的字符串(例如:1073741824),在这种情况下,请尝试:

let bytesInternet : Int64 = Int64(bytesInternetString)!


评论


谢谢您的协助。 Int()使用16位数字为我工作,但最近开始失败。

–瑞安·博伊德(Ryan Boyd)
16-4-30的7:03

#15 楼

最新的swift3代码只是将字符串转换为int

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


#16 楼

由于字符串可能包含非数字字符,因此应使用guard保护操作。示例:

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

useLabelInt()


#17 楼

我最近遇到了同样的问题。以下解决方案适合我:

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


#18 楼

使用此方法:

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


OR

从XIB或情节提要中将UITextField KeyboardType设置为DecimalTab,并删除任何条件(进行计算)即

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


因为键盘类型是DecimalPad,所以没有机会输入其他0-9或。

希望有帮助!

#19 楼

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


#20 楼

这对我有用

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


评论


这与评论中给出的解决方案有何不同?

–修剪
2015年10月15日在22:25

评论中给出的解决方案缺少“!”最后,这将在Swift 2及更高版本中实现

– Naishta
15年10月22日在20:45

#21 楼

适用于Swift3.x

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


#22 楼

Swift5将float或int字符串转换为int:

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())


#23 楼

用于替代解决方案。您可以使用本机类型的扩展名。您可以在操场上进行测试。

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


“ 2” .add(1)

#24 楼

我的解决方案是对字符串到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  
        }
    }

}


#25 楼

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


#26 楼

问题:不能使用Int(“ 4.000”)将字符串“ 4.0000”转换为整数吗?

答案:Int()检查字符串是否为整数,如果是,则为整数,否则为nil。但Float或Double可以将任何数字字符串转换为各自的Float或Double,而无需给出nil。例如,如果您有“ 45”整数字符串,但是使用Float(“ 45”)可以获取45.0浮点值,或者使用Double(“ 4567”)可以获取45.0。

解决方案:NSString(string:“ 45.000 “).integerValue或Int(Float(” 45.000“)!)!以获得正确的结果。

#27 楼

Swift中的Int包含一个接受String的初始化程序。它返回一个可选的Int?因为如果字符串中不包含数字,转换可能会失败。

通过使用if let语句,您可以验证转换是否成功。

所以您的代码变成了这样的东西:

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


#28 楼

Swift 5.0及更高版本

工作

如果要拆分String,它将创建两个substrings而不是两个Strings。下面的方法将检查Any并将其转换为t0 NSNumber,轻松将NSNumber转换为IntFloat您需要的数据类型。

实际代码

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


用法

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

}


通过String进行检查并转换为Double

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


#29 楼

从3开始,我必须强制执行#%@ !!字符串和整数带有“!”否则它将不起作用。

例如:

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)}吗?计数器在哪里是字符串?

–马丁
17-10-19在16:34

@马丁-不?使其为可选,从而在计数器字符串中添加单词“ optional”。

–山姆B
17-10-19在22:27

恕我直言,您不应该强行打开可选包装。优先使用警卫和if let语句

–马丁
17-10-20在7:56

#30 楼

在Swift 4中将字符串值转换为整数

let strValue:String = "100"
let intValue = strValue as! Int
var intValueFromString:Int = strValue as! Int
or
var intValueFromString = Int(strValue)!