SwiftUI中创建实现函数遇到的两个编译错误求解
问题修复方案
两个报错的原因和对应修复方式如下:
- 报错1
Cannot assign to property: 'self' is immutable:SwiftUI的View是struct值类型,普通实例方法不能直接修改未加状态包装器的存储属性;且combination本身是依赖两个选中值动态计算的结果,完全不需要定义为视图的存储属性。 - 报错2
Missing argument for parameter 'combination' in call:你定义了无默认值的存储属性combination,Swift会自动生成需要传入该参数的构造器,预览中调用时没传参数就会触发报错。
具体修改点
- 删除多余的存储属性
var combination: String,在returnCombo()方法内用局部变量存匹配结果直接返回,不需要给self属性赋值,同时解决两个报错的根源。 - 修正原代码中第一个Picker的大括号闭合错误(原代码ForEach和Picker的括号闭合位置错位,会额外触发编译错误)。
- 给
drug1Value、drug2Value设置初始值,避免首次加载时强制解包firstIndex返回nil导致崩溃。 - 修正原代码第二个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
相关产品推荐
相关产品推荐

