SwiftPlaygrounds中ollCase相关报错求助:实例成员与类型转换问题
错误原因分析
核心问题:混淆类型与实例的访问方式
所有错误本质都是直接用结构体类型(ollCase)访问实例属性,以及视图未正确接收数据实例:
ollName、ollImage是ollCase结构体的实例属性,必须通过具体的ollCase对象(而非类型本身)访问。ollRow视图未定义属性接收ollCase实例,导致无法获取数据。ForEach需要遍历数组(数据源),而非结构体类型。
具体错误对应原因
Instance member 'ollName' cannot be used on type 'ollCase':
直接用ollCase.ollName访问类型的实例属性,违反Swift语法,必须用具体实例对象。Cannot convert value of type 'ollCase.Type' to expected argument type 'Range<Int>':ForEach(ollCase)试图遍历结构体类型,而非allOLLCases中的OLLCases数组数据源。Argument passes to call that takes no arguments:
调用ollRow(case: Case)时,ollRow未定义对应的接收参数,参数不匹配。
修正后的完整代码
1. allOLLCasesView(同步修正命名规范,类型名首字母大写)
import SwiftUI // 结构体类型名首字母大写,符合Swift命名规范 struct OllCase: Identifiable { var ollName: String var ollImage: Image let id = UUID() } // 类名首字母大写 class AllOLLCases: ObservableObject { @Published var ollCases = [ OllCase(ollName: "1", ollImage: Image("1")), OllCase(ollName: "2", ollImage: Image("2")), OllCase(ollName: "3", ollImage: Image("3")), ] }
2. OLLRowView(添加属性接收OllCase实例)
import SwiftUI struct OllRow: View { // 定义属性接收具体的OllCase实例 var caseItem: OllCase var body: some View { HStack { // 通过实例访问属性 Text(caseItem.ollName) .padding() Spacer() // 直接使用实例中的Image对象,无需再次初始化Image caseItem.ollImage .resizable() .scaledToFit() .padding() } } }
3. OLLDetailView(可选:添加参数接收详情数据)
import SwiftUI struct OllDetail: View { // 可选:如果需要展示具体OLL案例的详情,添加接收参数 var caseItem: OllCase var body: some View { Text(caseItem.ollName) } }
4. OLLView(修正遍历数据源、访问实例属性)
import SwiftUI struct OllView: View { @EnvironmentObject var data: AllOLLCases var body: some View { NavigationSplitView { List { // 遍历ObservableObject中的数组数据源 ForEach(data.ollCases) { caseItem in NavigationLink { // 传递实例给详情页(如果需要) OllDetail(caseItem: caseItem) .navigationTitle(caseItem.ollName) } label: { // 传递实例给行视图 OllRow(caseItem: caseItem) } } } } detail: { Text("Select an OLL case") } } }
5. 关键补充:注入EnvironmentObject
在你的App入口(比如YourApp.swift)中,必须注入AllOLLCases的实例,否则@EnvironmentObject无法获取数据:
import SwiftUI @main struct YourAppName: App { // 创建数据源实例 private let ollData = AllOLLCases() var body: some Scene { WindowGroup { OllView() // 注入EnvironmentObject .environmentObject(ollData) } } }
内容的提问来源于stack exchange,提问作者Shae
相关产品推荐
相关产品推荐

