使用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个回答

1

Swift 4,Swift 5

有不同的情况需要将某些数据类型转换为其他数据类型,这取决于输入。

如果输入的数据类型是Any,我们必须在转换为实际数据类型之前使用as,然后再将其转换为我们想要的数据类型。例如:

func justGetDummyString() -> Any {
  return "2000"
}
let dummyString: String = (justGetDummyString() as? String) ?? "" // output = "2000"
let dummyInt: Int = Int(dummyString) ?? 0 // output = 2000

1
使用这个:
// 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键盘类型设置为DecimalTab,从您的XIB或storyboard中,删除任何执行计算的条件,即可实现。
var ans = a + b
answerLabel.text = "Answer is \(ans)"

因为键盘类型是 DecimalPad,所以没有机会输入其他的 0-9 或 .。
希望这可以帮到你!!

1

适用于 Swift 3.x

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

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

0

对于替代方案,您可以使用扩展本地类型。您可以在playground中进行测试。

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

"2".add(1)


0

在 Swift 中,Int 包含一个接受字符串的初始化器。如果字符串不是数字,则转换可能失败,返回可选的 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
    }
}

0
问题:为什么无法使用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")!)! 即可获得正确的结果。

0
我的解决方案是为字符串转换为整数提供一个通用扩展。
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  
        }
    }

}

0

Swift 5.0及以上版本

工作中

如果您正在拆分String,它会创建两个substrings而不是两个Strings。以下方法将检查Any并将其转换为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)

-1

Swift 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) } ? 这里的 counter 应该是一个 String? - Martin
@Martin - 不加任何数字会使其变成可选项,从而在计数字符串中添加“可选”一词。 - Sam B
在我看来,你不应该强制解包可选项。最好使用guardif let语句。 - Martin

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