使用Swift将字符串转换为整数

398
该应用程序基本上通过输入初始速度、最终速度和时间来计算加速度,然后使用一个公式来计算加速度。然而,由于文本框中的值是字符串,我无法将它们转换为整数。
@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
尚未尝试,但也许你可以像这样转换数值:var answer1 = Int(txtBox1.text) - dibi
1
如果你的字符串是"23.0",那么如果你将它转换为Int("23.0"),它会返回nil。对于这种情况,你需要先将其转换为Double/Float,然后再次转换为Int。 - Ariven Nadar
31个回答

365

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
1
@ManosSerifios 这个讨论可能会有帮助:https://dev59.com/b1wY5IYBdhLWcg3wcHbZ - Paraneetharan Saravanaperumal
不是真正相关的,但构造函数方法始终更受欢迎且更易读,用于将Int转换为字符串。"\(someInt)" 不好,String(someInt) 更容易阅读。 - mfaani
我正在打印 Int(firstText.text)!,但我仍然看到可选项。为什么?我没有解包吗? - mfaani
当字符串为nil时,这会导致崩溃。在这种情况下,如果字符串来自UI元素,则可能不会发生。但是防止崩溃的一种方法是向字符串添加默认值:let a:Int? = Int(firstText.text ?? "") - Jens
@Jens UITextFieldtext属性是可选的,但它的默认值是空字符串。即使在访问其值之前将nil分配给它,它也绝不会返回nil。可以使用if let value = Int(textField.text!) { print(value) }或使用nil合并运算符let value = Int(textField.text!) ?? .zero - Leo Dabus

344

基本思路,请注意这仅适用于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
4
如果您需要使用浮点数(并且实在非常想使用Double,而不是float),那么toInt()方法就无法满足需求。您可以根据现有的文档和自己的想象力,寻找一个合适的函数。 - gnasher729
4
我收到了'NSString' does not have a member named 'toInt'的错误提示。有什么想法吗? - Matej
1
NSStringString是两个不同的对象,拥有不同的方法。NSString有一个叫做.intValue的方法。 - Byron Coetsee
7
这个解决方案只适用于Swift而不是Swift2。现在你应该使用:Int(firstText.text)。 - gurehbgui
显示剩余5条评论

92

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

Swift 3.x

如果您有隐藏在字符串中的整数,可以通过使用整数构造函数进行转换,例如:

let myInt = Int(textField.text)

与其他数据类型(Float和Double)一样,您也可以使用NSString进行转换:

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

1
这实际上回答了问题,其他所有的都告诉OP如何将整数转换为字符串,而这不是他想问的。 - aremvee
请澄清“最新的Swift版本”,以便后人希望不会感到困惑 :) - Alex Hall
@aremvee 你是指将整数“转换”为字符串吗?这个操作有什么作用,能回答其他答案没有回答的问题吗? - Alex Hall

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

1
我刚把它改成了'myNumber.integerValue',因为Xcode 7不支持'use intValue'。后者是Int32值。 - brainray

33

编辑/更新: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
    }
}

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


Extensions UITextField.swift 文件内容:

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

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

Extensions StringProtocol.swift文件内容:

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

示例项目


22

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
}
你可以使用可选绑定(Optional Binding)而不是强制绑定(forced binding)。
例如:
  if let number = Int(stringNumber) { 
   // number is of type Int 
  }

16

Swift 4.2Xcode 10.1

let string = "789"
if let intValue = Int(string) {
    print(intValue)
}

let integerValue = 789
let stringValue = String(integerValue)

或者

let stringValue = "\(integerValue)"
print(stringValue)

关于:Int(string)!如果字符串为nil,Int?可选项也将为nil,然后强制解包nil可选项将导致崩溃。 - jcpennypincher
@jcpennypincher,您能否更新答案或者发布新的答案呢?这将对其他人非常有帮助。谢谢。 - Naresh

15

//Xcode 8.1 和 Swift 3.0

我们也可以通过可选绑定简单地处理它。

let occur = "10"

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

    }

7

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

7

对于字符串转换为整数和其他类型非常有用

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接