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.
相关产品推荐
相关产品推荐

