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

SwiftPlaygrounds中ollCase相关报错求助:实例成员与类型转换问题

错误原因分析

核心问题:混淆类型与实例的访问方式

所有错误本质都是直接用结构体类型(ollCase)访问实例属性,以及视图未正确接收数据实例:

  • ollName、ollImage是ollCase结构体的实例属性,必须通过具体的ollCase对象(而非类型本身)访问。
  • ollRow视图未定义属性接收ollCase实例,导致无法获取数据。
  • ForEach需要遍历数组(数据源),而非结构体类型。

具体错误对应原因

  1. Instance member 'ollName' cannot be used on type 'ollCase':
    直接用ollCase.ollName访问类型的实例属性,违反Swift语法,必须用具体实例对象。
  2. Cannot convert value of type 'ollCase.Type' to expected argument type 'Range<Int>':
    ForEach(ollCase)试图遍历结构体类型,而非allOLLCases中的OLLCases数组数据源。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 12:37:00