如何将NSString转换为Int?

3
我完全没有苹果编程的经验,但在了解 Swift 后,我觉得它很有意思。我试图在命令行上制作一个简单的猜数字游戏,但我无法将整数转换为字符串。我已经尝试在互联网上搜索了很多方法,但我不知道哪里出了问题。我不想直接将用户输入作为整数接受,我宁愿将其从字符串转换为整数以更轻松地处理错误(就像在 Python 中那样)。这是我所做的:
import Foundation
// Get Input
let standardInput = NSFileHandle.fileHandleWithStandardInput()
// Convert to int function
func convertToInt(guess: String) -> Int {
    var num: Int = guess.toInt()! // It tells me "Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)" on this line and the program stops
    return num
}
println("Please enter your name.")
// Get the user's name
let data = standardInput.availableData
var name = NSString(data: data, encoding: NSASCIIStringEncoding)
println("Hello \(name)")
println("Please enter a number and I will try to guess it.")
// Get the user's number
let data2 = standardInput.availableData
var number = NSString(data: data2, encoding: NSASCIIStringEncoding)
// Call the function to convert the number to an int
var newnum = convertToInt(number)
println(newnum)

运行后,它告诉我:
fatal error: Can't unwrap Optional.None (lldb)

在调试区。我不知道如何解决这个问题。有没有办法直接从NSString转换成Int

在调试区出现了问题,我不知道该怎么修复。是否有一种方法可以直接将一个数字从NSString转换为Int

2
你有查看过NSNumber吗? - jakenberg
2
你有查看过NSString吗? - Hot Licks
4个回答

2
在Swift 2中,toInt()方法已被移除。请使用Int()方法。
例如:
var tempInt :Int  = Int("24")!

2

您的代码存在几个问题,但为了回答问题,问题出在您对可选项的误用上(这在来自wwdc的Swift视频介绍中有涉及)。

toInt方法返回的是可选项而不是Int。可选项是回答以下问题的答案:“如果我要转换的字符串不是数字,应该返回什么?”同样的情况也适用于试图从字典中访问不存在的键。在Objective-C世界中,我们返回nil,但在Swift中则是可选项。您需要做的是检查是否有值返回,如果有,则可以使用它。例如:

 if let number = guess.toInt() {
      //now we can do something with number because we know conversion worked
      println(number)
 } else {
      println("a number wasn't entered")
 }

我强烈建议Jeremy要么下载并阅读Swift书籍,要么观看WWDC视频,以便真正理解这段代码,使其不再是一些魔法。 - gnasher729

1
 var numberFormatter:NSNumberFormatter = NSNumberFormatter()
    numberFormatter.usesGroupingSeparator = true
    numberFormatter.groupingSeparator = ",";
    numberFormatter.groupingSize = 3;
    var number:String? = numberFormatter.stringFromNumber(numberFormatter.numberFromString("15487787878787")!)

1
< p > toInt 方法返回一个 Optional。在使用它之前,应该检查是否返回了值。

var name: String = NSString(string: "1234")
var integer:Int? = name.toInt()
if let integer = integer {
    println("\(integer)")
}

您还可以使用 NSNumberFormatter 来从字符串中获取数字。请注意,这将返回一个 NSNumber,但您可以轻松地将其转换为 Swift 的 Int
var numberFormatter = NSNumberFormatter()
var number:NSNumber? = numberFormatter.numberFromString("1234")
if let number = number {
    var integer = Int(number)
    println("\(integer)")
}

toIntnumberFromString返回选项。如果字符串无法转换为数字,则它们将返回nil


1
顺便提一下,你不需要使用 as String;你可以使用更弱的 let name: String = x,因为编译器会隐式(而不是显式)转换。这样更安全,因为如果 x 是任意类型,它将在编译时报错,但如果 x 是 NSString,则不会像 as 一样导致运行时错误。(实际上,OP 的代码就是这样做的,而且编译器使其正常工作。) - Jesse Rusak
谢谢,非常好知道。根据您的评论更新了答案。 - Jason
所以我根据那个答案编写了这个函数:**func convertToInt(guess: String) -> Int { var num: Int? = guess.toInt() if let num = num { return num } else { return 1 } }**问题是,每当我输入一个数字时,该函数都会返回1,这意味着没有进行转换(我猜测)。 - Jeremy M

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