gpt4 book ai didi

swift - 字典导致 Swift 中索引超出范围错误

转载 作者:行者123 更新时间:2023-11-30 11:32:49 24 4
gpt4 key购买 nike

很抱歉,如果已经有人问过这个问题,但我还没有找到解决方案。我是 Swift 新手,所以请耐心等待。我不明白为什么我总是收到线程 1: fatal error :索引超出范围的错误。我以前用过同样的方法来显示 txt 文件,但以前从未遇到过问题,所以这是第一次。我试图将坐标显示为文本详细信息,并将日期和时间显示为单元格本身中的文本。

日期和时间

纬度、经度

类似上面的东西(想象一下它在一个单元格中)

以下是我的程序代码

import UIKit
import MapKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {



//Array to store the list
var storeCoordinates = [String: String]()
var arrayClient = NSMutableArray()
var readings: [String] = [" "]

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.



//Get path of where the file is
let path = Bundle.main.path(forResource: "gps_coords", ofType: "csv")

//Use filemanager to check if the file exist to avoid crashing if it doesn't exist
let fileMgr = FileManager.default

//Display the number of line counts we have
if fileMgr.fileExists(atPath: path!){
do {
let fulltext = try String(contentsOfFile: path!, encoding: String.Encoding.utf8)

readings = fulltext.components(separatedBy: "\n") as [String]

for i in 0..<readings.count{
let listData = readings[i].components(separatedBy: ";") as [String]

storeCoordinates["Latitude"] = "\(listData[0])"
storeCoordinates["Longitude"] = "\(listData[1])"
storeCoordinates["DateAndTime"] = "\(listData[2])"

arrayClient.add(storeCoordinates)
}
} catch let error as NSError {
print("Error: \(error)")
}
}
self.title = "Number of entries: \(arrayClient.count)"
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return arrayClient.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cellReuseIdentifier", for: indexPath)

let client = arrayClient[indexPath.row] as AnyObject

cell.textLabel?.text = "\(client.object(forKey: "DateAndTime")!)"
cell.detailTextLabel?.text = "\(client.object(forKey: "Latitude")!) \(client.object(forKey: "Longitude")!)"

return cell

}

func numberOfSections(in tableView: UITableView) -> Int {
return 1
}

}

我遇到的错误是 storeCooperatives["Latitude"] = "\(listData[0])"使用断点,它显示纬度值以及经度和日期和时间不为空,但如果我尝试在模拟器中运行应用程序,它会给出错误线程1: fatal error :索引超出范围。到目前为止,还没有找到解决这个问题的方法。如果你能帮我弄清楚,这对我来说意义重大。请并谢谢您。

最佳答案

我认为不可靠的 CSV 格式是问题的根源。

这是一个使用更好的格式 (JSON) 和更强大的数据源的快速教程。

第 1 部分:将 CSV 转换为 JSON

  1. 创建一个新的空白 Playground(按 ⌥⇧⌘N)平台ma​​cOS
  2. ⌘0 显示 Playground 的项目导航器。
  3. ⌥将 CSV 文件从主项目的项目导航器拖动到 Playground 的 Resources 文件夹中。
  4. 将以下代码粘贴到 Playground 中,它会根据您的代码来解析 CSV。它将 CSV 转换为 JSON 并在桌面上创建一个文件 gps_coords.json。如果缺少任何字段,您将收到 fatal error 。

    struct Coordinate : Encodable {
    let latitude, longitude, dateAndTime : String
    }

    let url = Bundle.main.url(forResource: "gps_coords", withExtension: "csv")!
    let fulltext = try! String(contentsOf: url, encoding: .utf8)
    let lines = fulltext.components(separatedBy: .newlines)
    let coordinates = lines.map { paragraph -> Coordinate in
    let components = paragraph.components(separatedBy: ";")
    if components.count != 3 { fatalError("Each line must contain all three fields")}
    return Coordinate(latitude: components[0], longitude: components[1], dateAndTime: components[2])
    }
    do {
    let data = try JSONEncoder().encode(coordinates)
    let homeURL = URL(fileURLWithPath: NSHomeDirectory())
    let destinationURL = homeURL.appendingPathComponent("Desktop/gps_coords.json")
    try data.write(to: destinationURL)
    } catch { print(error) }

第 2 部分:实现新文件

  1. 关闭 Playground 。不再需要了。
  2. 将新文件从桌面拖动到项目导航器中(确保选中Copy If Needed)。
  3. ViewController 类更改为

    import UIKit
    import MapKit

    struct Coordinate : Decodable {
    let latitude, longitude, dateAndTime : String
    }

    class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    var arrayClient = [Coordinate]()

    override func viewDidLoad() {
    super.viewDidLoad()
    let url = Bundle.main.url(forResource: "gps_coords", withExtension: "json")!
    let data = try! Data(contentsOf: url)
    arrayClient = try! JSONDecoder().decode([Coordinate].self, from: data)
    self.title = "Number of entries: \(arrayClient.count)"
    tableView.reloadData()
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return arrayClient.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cellReuseIdentifier", for: indexPath)
    let client = arrayClient[indexPath.row]

    cell.textLabel?.text = client.dateAndTime
    cell.detailTextLabel?.text = client.latitude + " " + client.longitude
    return cell
    }
    }

    注意: UITableView 导出丢失,我添加了行来重新加载数据。还要确保 delegatedatasource 在 Interface Builder 中从表视​​图连接到 ViewController

  4. 删除 CSV 文件。

新代码使用结构体Cooperative作为数据源,并使用JSONDecoder非常方便地解码JSON。请注意缺少的类型转换和从字典中获取值的繁琐的 key 订阅。

关于swift - 字典导致 Swift 中索引超出范围错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50078636/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com