gpt4 book ai didi

ios - 有效地在多个类之间进行选择

转载 作者:可可西里 更新时间:2023-11-01 00:57:16 25 4
gpt4 key购买 nike

以编程方式编写 UI 我每次都会遇到这个问题。

用户按下一个按钮,根据数据,我必须选择打开哪个窗口,其中每个窗口都是一个自定义类 (UIView)。

如果我必须在 10 个选项之间做出选择,我会得到这个:

                   if ( name == "option1" ) {
let Picker1:PortsPicker1 = PortsPickerView(frame:WindowsRect)
Picker1.delegate=self
Picker1.setWithPorts(ports: blockData["PORTS"] as! [String], selectedPorts: ["1"])
self.view.addSubview(Picker1)
}
if( option 2 .... ){...}

然后考虑有 10 个这样的选项,其中每个选项都是要显示的不同类 View 。

通常,您可以在一行中使用变量执行此逻辑,但由于类名不是变量,因此您不能执行类似“array[name]”的操作。

什么是根据某些条件返回一种类 (Picker1,Picker2) 的好方法,这样我就不必重写所有这些行(例如picker1.delegate=self)

最佳答案

假设您的 Picker View 具有相同的属性和方法,您有多种解决方案:

基类:您可以创建一个基类,它将具有共同的属性,并让 Picker View 来扩展它。你的代码会变成这样:

var picker: PortsPicker? = nil
if ( name == "option1" ) {
picker = PortsPickerViewOne(frame:WindowsRect)
else if ( name == "option2" ) {
picker = PortsPickerViewTwo(frame:WindowsRect)
} else {
// Other code for not handled options
}

if let pickerView = picker {
pickerView.delegate = self
pickerView.setWithPorts(ports: blockData["PORTS"] as! [String], selectedPorts: ["1"])
self.view.addSubview(pickerView)
}

协议(protocol):这是与前一种方法类似的方法,您可以为您的选择器创建一个基本协议(protocol),以便它们都具有您需要的属性/方法:

var picker: PortsPickerProtocol? = nil
if ( name == "option1" ) {
picker = PortsPickerViewOne(frame:WindowsRect)
else if ( name == "option2" ) {
picker = PortsPickerViewTwo(frame:WindowsRect)
} else {
// Other code for not handled options
}

if let pickerView = picker {
pickerView.delegate = self
pickerView.setWithPorts(ports: blockData["PORTS"] as! [String], selectedPorts: ["1"])
self.view.addSubview(pickerView)
}

基于这些选项,有一些改进代码的方法:

  • 选项变为枚举,避免复制/粘贴和输入错误
  • 一旦有了枚举,就可以将创建移动到不同的组件中,创建一个工厂。它会变成这样:

    类 PickerFactory {

    pickerForValue(value: OptionEnum) -> PortsPicker? {
    switch(value) {
    case OptionPicker1:
    return PortsPickerViewOne
    case OptionPicker2:
    return PortsPickerViewTwo
    }

    return nil
    }

您的代码(取自示例基类)变成如下内容:

if let pickerView = PickerFactory().pickerForValue("option1") {
pickerView.delegate = self
pickerView.setWithPorts(ports: blockData["PORTS"] as! [String], selectedPorts: ["1"])
self.view.addSubview(pickerView)
}

更干净、更安全,不会出现复制/粘贴或输入错误。

工厂在不同方法/属性的情况下也非常有用,在开关中你可以执行你需要的。

关于ios - 有效地在多个类之间进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43318615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com