如何为PushRow与MultipleSelectorRow设置选项的实际值与显示值
给Eureka的PushRow/MultipleSelectorRow设置实际值与显示值的方案
没问题!要实现PushRow和MultipleSelectorRow的「实际值(业务逻辑用)」与「显示值(选择界面展示)」分离,用自定义Hashable类型确实是最稳妥的做法,我给你详细拆解步骤:
1. 定义自定义Hashable类型
首先创建一个结构体(或类)来封装实际值和显示值,必须实现Hashable协议(因为Eureka的options要求元素是可哈希的,用来区分不同选项):
struct OptionItem: Hashable { let value: String // 后台/业务逻辑使用的实际值 let displayValue: String // 选择界面要展示的友好文字 // 基于实际值实现哈希,保证选项唯一性 func hash(into hasher: inout Hasher) { hasher.combine(value) } // 基于实际值判断两个选项是否相等 static func == (lhs: OptionItem, rhs: OptionItem) -> Bool { return lhs.value == rhs.value } }
提示:如果你的实际值是
Int、UUID等其他类型,只需把value的类型改成对应类型,哈希和相等判断逻辑跟着调整即可。如果用类而不是结构体,要注意正确处理引用类型的相等判断,避免出现逻辑错误。
2. 配置PushRow(单选场景)
在表单配置中,给PushRow设置options为自定义类型的数组,同时通过displayValueFor指定选择界面的显示内容:
form +++ Section("单选选项") <<< PushRow<OptionItem>("single_option") { row in row.title = "选择项目" // 传入包含实际值和显示值的选项数组 row.options = [ OptionItem(value: "1", displayValue: "第一个选项"), OptionItem(value: "2", displayValue: "第二个选项"), OptionItem(value: "3", displayValue: "第三个选项") ] // 指定选择界面中每个选项的显示文字 row.displayValueFor = { item in return item?.displayValue } } .onChange { row in // 获取选中的实际值,用于业务逻辑 if let selectedItem = row.value { print("选中的实际值:\(selectedItem.value)") } }
3. 配置MultipleSelectorRow(多选场景)
多选场景的配置逻辑类似,额外可以自定义表单行上的已选内容展示:
form +++ Section("多选选项") <<< MultipleSelectorRow<OptionItem>("multiple_options") { row in row.title = "多选项目" row.options = [ OptionItem(value: "a", displayValue: "选项A"), OptionItem(value: "b", displayValue: "选项B"), OptionItem(value: "c", displayValue: "选项C") ] // 指定选择界面的显示文字 row.displayValueFor = { item in return item?.displayValue } } // 自定义表单行上的已选内容展示(可选) .cellUpdate { cell, row in if let selectedItems = row.value { cell.textLabel?.text = selectedItems.map { $0.displayValue }.joined(separator: ", ") } else { cell.textLabel?.text = "未选择" } } .onChange { row in // 获取所有选中的实际值数组 if let selectedItems = row.value { let actualValues = selectedItems.map { $0.value } print("选中的实际值数组:\(actualValues)") } }
关键注意点
displayValueFor是核心:如果不设置这个闭包,选择界面会默认显示OptionItem的调试描述(比如OptionItem(value: "1", displayValue: "第一个选项")),完全达不到预期效果。- 唯一性保证:哈希和相等判断一定要基于实际值,确保业务上相同的选项不会被重复识别。
内容的提问来源于stack exchange,提问作者Chamitha
相关产品推荐
相关产品推荐

