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

Swift4:如何获取其他类枚举内容及实现带PickerView的传参跳转

我来帮你搞定这两个Swift开发的问题哈~

问题1:Swift4中如何获取另一个类中定义的枚举内容?

其实核心看枚举的访问级别和定义位置,分两种情况:

  • 如果枚举是嵌套在目标类内部,且和当前类在同一模块(比如同一个项目/Target里),直接通过「类名.枚举名.枚举值」的方式访问就好。举个实际例子:
    假设你有个工具类OrderManager,里面定义了处理订单的枚举:
class OrderManager {
    enum OrderStatus {
        case pending, processing, completed, cancelled
    }
}

那在其他类里直接这么调用:

let currentStatus = OrderManager.OrderStatus.processing
  • 如果需要跨模块访问(比如你用了第三方库的类,或者自己的多个Target),只要把枚举的访问级别改成public(如果需要被继承就用open)就行:
class OrderManager {
    public enum OrderStatus {
        case pending, processing, completed, cancelled
    }
}

这样在其他模块里同样可以用OrderManager.OrderStatus.completed来访问枚举值。

要是枚举是定义在类的extension里,用法也是完全一样的,只要访问级别允许就行~

问题2:根据传入的tipo参数配置通用PickerViewController

这个需求的核心是把参数传递到目标VC,再根据参数动态生成PickerView的数据源,我给你一步步拆解实现:

第一步:在目标VC(ViewControllerSelect)里准备接收参数和配置Picker

首先要在ViewControllerSelect里定义接收tipo的属性,同时实现PickerView的代理和数据源方法,根据tipo加载对应内容:

class ViewControllerSelect: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
    // 定义接收传入的tipo参数(这里假设tipo是你自定义的枚举,比如叫TipoOption)
    var tipo: TipoOption!
    // 存储PickerView的数据源
    private var pickerOptions: [String] = []
    
    // 假设你已经通过Storyboard关联了PickerView的IBOutlet
    @IBOutlet weak var customPickerView: UIPickerView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 设置PickerView的代理和数据源
        customPickerView.dataSource = self
        customPickerView.delegate = self
        // 根据传入的tipo加载对应的选项
        setupPickerData()
    }
    
    // 根据tipo动态生成Picker选项
    private func setupPickerData() {
        switch tipo {
        case .entrega:
            pickerOptions = ["当日送达", "次日达", "预约配送"]
        case .retirada:
            pickerOptions = ["门店自提", "快递柜取件"]
        case .pagamento:
            pickerOptions = ["微信支付", "支付宝", "银行卡"]
        // 记得处理枚举的所有case,避免编译警告
        default:
            pickerOptions = ["暂无选项"]
        }
    }
    
    // MARK: - UIPickerView数据源方法
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        // 单列Picker,返回1
        return 1
    }
    
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return pickerOptions.count
    }
    
    // MARK: - UIPickerView代理方法
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return pickerOptions[row]
    }
}

第二步:在MainViewController里完善跳转逻辑,传递tipo参数

把你原有的跳转方法优化一下,避免强制解包崩溃,然后传入tipo参数:

@objc func handlerSelectOpTipo(_ sender: UILabel) {
    // 用guard let代替强制解包,更安全
    guard let vcSelectTipo = storyboard?.instantiateViewController(withIdentifier: "ViewControllerSelect") as? ViewControllerSelect else {
        print("无法实例化ViewControllerSelect")
        return
    }
    // 传入你需要的tipo值,比如这里的.entrega
    vcSelectTipo.tipo = .entrega
    // 如果是导航控制器,用push跳转
    navigationController?.pushViewController(vcSelectTipo, animated: true)
    // 如果是模态跳转,用下面这句
    // present(vcSelectTipo, animated: true)
}

额外提醒:

  • 确保你的TipoOption枚举是在两个类都能访问到的位置定义的(比如单独创建一个枚举文件,或者放在公共的工具类里)
  • 如果tipo是字符串/整数类型,只要修改setupPickerData里的判断逻辑就行,核心思路不变

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:37:01