You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift新手求助:CSV文件导入数组失败,提示文件不存在

问题解决

核心错误原因

  • URL构造错误:你用fileURLWithPath处理网络地址,这个方法仅适用于本地文件路径,网络URL必须用URL(string:)来创建。
  • 主线程阻塞风险:在View初始化时同步执行网络请求会卡住UI,必须改用异步操作。
  • 数组越界隐患:如果加载失败返回错误数组,直接访问words2[0]可能导致崩溃。

修正后的代码

import SwiftUI

func getCSVData() async throws -> [String] {
    guard let url = URL(string: "http://www.rupert.id.au/resources/4000-most-common-english-words-csv.csv") else {
        throw NSError(domain: "InvalidURL", code: 0, userInfo: [NSLocalizedDescriptionKey: "无法创建有效URL"])
    }
    
    let content = try String(contentsOf: url)
    return content.components(separatedBy: "\n")
        .filter { !$0.isEmpty } // 过滤空行
        .map { $0.components(separatedBy: ",")[0] }
}

struct ContentView: View {
    @State private var words: [String] = []
    @State private var errorMessage: String?
    
    var body: some View {
        VStack {
            if let error = errorMessage {
                Text("加载失败:\(error)")
            } else if words.isEmpty {
                Text("加载中...")
            } else {
                Text(words[0])
            }
        }
        .task {
            do {
                words = try await getCSVData()
            } catch {
                errorMessage = error.localizedDescription
            }
        }
    }
}

关键修改说明

  • 把getCSVData改成异步函数(async throws),符合现代Swift网络请求的最佳实践。
  • 用@State变量存储数据和错误信息,响应式更新UI。
  • 使用.task修饰符在View出现时发起异步请求,不会阻塞主线程。
  • 添加了URL有效性检查、空行过滤,以及加载状态/错误状态的UI展示,避免崩溃和提升用户体验。

内容的提问来源于stack exchange,提问作者Donald Albin Jr.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 15:53:26