【问题标题】:Swift OS X String to Int Conversion ErrorSwift OS X String 到 Int 的转换错误
【发布时间】:2016-03-25 03:57:14
【问题描述】:

我在我的 Swift OS X Xcode 项目中将 String 转换为 Int 时遇到问题。我有一些数据以逗号分隔格式保存在文本文件中。文本文件的内容如下:

1、赛斯纳 172,3,54.4,124,38.6112

(最后有一个换行符)

我读取文本文件并将其分开,首先通过\n 单独获取每一行,然后通过, 单独获取每个元素。执行此操作的代码如下:

    if let dir : NSString = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true).first {
        let path = dir.stringByAppendingPathComponent("FSPassengers/aircraft.txt")

        do {
            let content = try NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding)

            if content != "" {
                let astrContent:[String] = content.componentsSeparatedByString("\n")
                for aeroplane in astrContent {
                    let aSeperated:[String] = aeroplane.componentsSeparatedByString(",")

                    print(aSeperated[0])
                    print(Int(aSeperated[0]))

                    //self.aAircraft.append(Aircraft(id: aSeperated[0], type: aSeperated[1], passengerCapacity: Int(aSeperated[2])!, cargoCapacityKg: Double(aSeperated[3])!, cruiseSpeed: Int(aSeperated[4])!, fuelLitresPerHour: Double(aSeperated[5])!))
                }
            }
        }
        catch {
            print("Error")
        }
    }

这里的最终结果是将每条记录(文本文件的每一行)分配到数组aAircraft。该数组由一个名为Aircraft 的自定义对象组成。自定义类如下:

class Aircraft: NSObject {
var id:Int = Int()
var type:String = String()
var passengerCapacity:Int = Int()
var cargoCapacityKg:Double = Double()
var cruiseSpeed:Int = Int()
var fuelLitresPerHour:Double = Double()

override init() {}
init(id:Int, type:String, passengerCapacity:Int, cargoCapacityKg:Double, cruiseSpeed:Int, fuelLitresPerHour:Double) {
    self.id = id
    self.type = type
    self.passengerCapacity = passengerCapacity
    self.cargoCapacityKg = cargoCapacityKg
    self.cruiseSpeed = cruiseSpeed
    self.fuelLitresPerHour = fuelLitresPerHour
}

}

在上面的第一个代码提取中,我将文本文件内容拆分并尝试将它们分配到数组中,您会看到我已经注释掉了 append 行。我这样做是为了编译应用程序,目前它正在向我抛出错误。

该错误涉及根据需要将 String 值转换为 Int 和 Double 值。例如,Aircraft.idaSeperated[0] 需要是 Int。您可以看到我使用Int(aSeperated[0]) 行将String 转换为Int 以便将其分配给自定义对象。但是,这行代码失败了。

第一个代码提取中的两个打印语句输出以下值:

1
可选(1)

如果我在第二个打印语句的末尾添加! 来制作它们:

print(aSeperated[0])
print(Int(aSeperated[0])!)

我得到以下输出:

我理解错误的含义,它试图解开一个可选值,因为我强制解开它,它在我传递给它的字符串中找不到 Int 值,但我不明白我为什么会这样得到错误。字符串值为1,很明显是一个整数。我做错了什么?

【问题讨论】:

  • 看看 print(astrContent)。 asrContent "1,Cessna 172,3,54.4,124,38.6112"" 中的第一个元素和 asrContent 中的第二个元素为零吗?'astrContent' 中的第一个 'aeroplane' 很好,但第二个 'aeroplane' 失败了。你打开的 1打印为 Int;但是,下一行是空白,然后是错误。
  • 谢谢,就这么多。代码很好,但在第二行失败了。我添加了错误检查以仅在数据行上执行操作。非常感谢!

标签: string swift macos int unwrap


【解决方案1】:

因为Casena 172 不能转换为Int。您还有其他十进制数字,在将它们转换为 Int 时会丢失精度。使用 NSScanner 从 CSV 字符串创建初始化程序:

init(csvString: String) {
    let scanner = NSScanner(string: csvString)
    var type: NSString?

    scanner.scanInteger(&self.id)
    scanner.scanLocation += 1
    scanner.scanUpToString(",", intoString: &type)
    self.type = type as! String
    scanner.scanLocation += 1
    scanner.scanInteger(&self.passengerCapacity)
    scanner.scanLocation += 1
    scanner.scanDouble(&self.cargoCapacityKg)
    scanner.scanLocation += 1
    scanner.scanInteger(&self.cruiseSpeed)
    scanner.scanLocation += 1
    scanner.scanDouble(&self.fuelLitresPerHour)
}

用法:

let aircraft = Aircraft(csvString: "1,Cessna 172,3,54.4,124,38.6112")

【讨论】:

  • 感谢您的回答。我知道Cessna 172 不会转换为 Int,我不想这样做,我想在那里获取第一个元素(我将其分配为 ID)。该元素的值为“1”,如上所示。
【解决方案2】:

正如@mrkxbt 提到的,问题与文本文件中数据后的空白行有关。字符串在\n 处被拆分,它将两个值分配到数组中。第一个值是包含数据的字符串,第二个是空字符串,因此显然第二组拆分(,)失败了。修改后的工作代码如下:

    if let dir : NSString = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true).first {
        let path = dir.stringByAppendingPathComponent("FSPassengers/aircraft.txt")

        do {
            let content = try NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding)

            if content != "" {
                let astrContent:[String] = content.componentsSeparatedByString("\n")
                for aeroplane in astrContent {
                    if aeroplane != "" {
                        let aSeperated:[String] = aeroplane.componentsSeparatedByString(",")

                        print(aSeperated[0])
                        print(Int(aSeperated[0])!)

                        self.aAircraft.append(Aircraft(id: Int(aSeperated[0])!, type: aSeperated[1], passengerCapacity: Int(aSeperated[2])!, cargoCapacityKg: Double(aSeperated[3])!, cruiseSpeed: Int(aSeperated[4])!, fuelLitresPerHour: Double(aSeperated[5])!))
                    }
                }
            }
        }
        catch {
            print("Error")
        }
    }

【讨论】:

    猜你喜欢
    • 2023-01-08
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 2014-08-01
    • 2014-07-29
    相关资源
    最近更新 更多