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

SwiftUI中创建实现函数遇到的两个编译错误求解

问题修复方案

两个报错的原因和对应修复方式如下:

  • 报错1 Cannot assign to property: 'self' is immutable:SwiftUI的View是struct值类型,普通实例方法不能直接修改未加状态包装器的存储属性;且combination本身是依赖两个选中值动态计算的结果,完全不需要定义为视图的存储属性。
  • 报错2 Missing argument for parameter 'combination' in call:你定义了无默认值的存储属性combination,Swift会自动生成需要传入该参数的构造器,预览中调用时没传参数就会触发报错。

具体修改点

  1. 删除多余的存储属性var combination: String,在returnCombo()方法内用局部变量存匹配结果直接返回,不需要给self属性赋值,同时解决两个报错的根源。
  2. 修正原代码中第一个Picker的大括号闭合错误(原代码ForEach和Picker的括号闭合位置错位,会额外触发编译错误)。
  3. 给drug1Value、drug2Value设置初始值,避免首次加载时强制解包firstIndex返回nil导致崩溃。
  4. 修正原代码第二个Picker的标题笔误(原代码写的是"Drug One",应为"Drug Two")。

修复后完整可运行代码

import SwiftUI
struct DrugCombinationPicker: View {
    @Environment(\.colorScheme) var colorScheme
    @State var drug1Value: String = "Shrooms"
    @State var drug2Value: String = "Cannabis"
    let drugs: [String] = ["Shrooms", "Cannabis", "MDMA", "Cocaine", "Caffeine", "Alcohol", "Benzodiazephines", "Opiods"]
    
    var body: some View {
        VStack(spacing: 20) {
            Text("Pick two drug combinations")
                .font(.headline)
            
            HStack {
                Picker("Drug One", selection: $drug1Value) {
                    ForEach(drugs, id: \.self) { drug1 in
                        Text(drug1)
                    }
                }
                .pickerStyle(.menu)
                Spacer()
            }
            
            HStack {
                Picker("Drug Two", selection: $drug2Value) {
                    ForEach(drugs, id: \.self) { drug2 in
                        Text(drug2)
                    }
                }
                .pickerStyle(.menu)
            }
            
            Text("Your selected combination is \(returnCombo())")
                .padding(.top)
        }
        .padding()
    }

    func returnCombo() -> String {
        let choice1 = drugs.firstIndex(where: { $0 == drug1Value })!
        let choice2 = drugs.firstIndex(where: { $0 == drug2Value })!
        // 交互等级定义
        //0 = No interaction
        //1 = Safe & No Synergy
        //2 = Safe & Synergy
        //3 = Unsafe
        //4 = Safe/Decreases high
        //5 = Deadly
        let matrix = [
            [0,2,2,1,1,1,4,1],
            [2,0,2,1,1,1,4,2],
            [2,2,0,3,3,3,4,3],
            [1,1,3,0,3,3,4,5],
            [1,1,3,3,0,1,4,1],
            [1,1,3,3,1,0,5,5],
            [4,4,4,4,4,5,0,5],
            [1,2,3,5,1,5,5,0]
        ]
        let decision = matrix[choice1][choice2]
        
        let result: String
        switch decision {
        case 0: result = "No interaction"
        case 1: result = "Safe & No Synergy"
        case 2: result = "Safe & Synergy"
        case 3: result = "Unsafe"
        case 4: result = "Safe/Decreases high"
        case 5: result = "Deadly"
        default: result = "Unknown interaction"
        }
        return result
    }
}

struct DrugCombinationPicker_Previews: PreviewProvider {
    static var previews: some View {
        DrugCombinationPicker()
    }
}

可选优化:代码里把多分支if-else改成了switch判断,可读性更高;给视图加了基础的间距和内边距,Picker用了菜单样式,显示效果更自然。


内容的提问来源于stack exchange,提问作者Tom154ce

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 18:24:40