Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Swift OS X字符串到整数转换错误_String_Swift_Macos_Int_Unwrap - Fatal编程技术网

String Swift OS X字符串到整数转换错误

String Swift OS X字符串到整数转换错误,string,swift,macos,int,unwrap,String,Swift,Macos,Int,Unwrap,在我的Swift OS X Xcode项目中将字符串转换为Int时遇到问题。我有一些数据以逗号分隔的格式保存在文本文件中。文本文件的内容如下: if let dir : NSString = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true).first { let path = d

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

    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")
        }
    }
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
}
    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")
        }
    }
1,塞斯纳172,3,54.4124,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")
        }
    }
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
}
    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")
        }
    }
这里的最终结果是将每条记录(文本文件的每一行)分配到数组
aAircraft
。该数组由一个名为
飞机
的自定义对象组成。自定义类如下所示:

    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")
        }
    }
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
}
    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")
        }
    }
}

在上面的第一个代码摘录中,我将文本文件内容拆分并尝试将它们分配到数组中,您将看到我已经注释掉了
append
行。我这样做是为了让应用程序能够编译,但现在它却给我带来了错误

错误围绕字符串值转换为Int和Double值(根据需要)。例如,
airpair.id
asoperated[0]
需要是一个Int。您可以看到,我使用行
Int(asoperated[0])
将字符串转换为Int,以便将其分配给自定义对象。但是,这行代码失败了

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

1
可选(1)

如果我添加一个
到第二个print语句的末尾,以使它们:

打印(A操作[0])

print(Int(操作[0])!)

我得到以下输出:


我理解错误的含义,它试图打开一个可选值,因为我强制打开了它,它在我传递给它的字符串中找不到Int值,但我不理解为什么会出现错误。字符串值是
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")

> @ 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 {
                    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")
        }
    }
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
}
    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")
        }
    }

看看印刷品(内容)。是内容“1,Cessna 172,3,54.4124,38.6112”中的第一个元素“第二个元素是零吗?《阿斯特content》中的第一架“飞机”不错,但第二架“飞机”失败了。未包装的1打印为整数;但是,下一行是空的,然后是错误。谢谢,就这些。代码很好,但在第二行失败。我添加了错误检查,以便仅在包含数据的行上执行操作。非常感谢你!谢谢你的回答。我知道Cessna 172不会转换为Int,我不是在尝试,我是在尝试获取那里的第一个元素(我将其指定为ID)。元素的值为“1”,可以在上面看到。