【问题标题】:How can I convert an NSString to an Int?如何将 NSString 转换为 Int?
【发布时间】:2014-06-11 00:44:12
【问题描述】:

我对 Apple 编程完全陌生,但我认为 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

【问题讨论】:

标签: ios cocoa nsstring swift


【解决方案1】:

您的代码存在几个问题,但要回答手头的问题,问题在于您滥用可选选项(这在 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 视频,以真正理解这段代码,这样它就不仅仅是魔法了。
【解决方案2】:

在 Swift 2 中,toInt() 方法被删除。使用Int()方法。

例如:

var tempInt :Int  = Int("24")!

【讨论】:

    【解决方案3】:

    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

    【讨论】:

    • FWIW,你不需要as String;您可以使用较弱的let name: String = x,因为编译器将隐式(而不是显式)转换。这更安全,因为如果 x 是 Any 类型,但如果 x 是 NSString 则不会出现编译时错误(与 as 不同,它会产生运行时错误)。 (事实上​​ OP 的代码正是这样做的,编译器使它工作。)
    • 谢谢,很高兴知道。根据您的评论更新了答案。
    • 所以我根据这个答案编写了这个函数: func convertToInt(guess: String) -> Int { var num: Int? =guess.toInt() if let num = num { return num } else { return 1 } } 问题是,每当我输入一个数字时,函数都会返回 1,这意味着没有进行任何转换(我猜)。
    【解决方案4】:
     var numberFormatter:NSNumberFormatter = NSNumberFormatter()
        numberFormatter.usesGroupingSeparator = true
        numberFormatter.groupingSeparator = ",";
        numberFormatter.groupingSize = 3;
        var number:String? = numberFormatter.stringFromNumber(numberFormatter.numberFromString("15487787878787")!)
    

    【讨论】:

      猜你喜欢
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 2015-04-30
      • 2012-08-22
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      相关资源
      最近更新 更多