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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:21:14