两个使用相同功能创建自定义视图的类-Swift

问题描述 投票:0回答:2

我是Swift的新手,我无法弄清楚。我有两个类,需要使用相同的函数来设置自定义UIStackVIew(显示评分星号的评分控件)。每个类都有一个称为value的变量,需要在函数内部传递。我不想在每个类中复制setUpStackView函数的相同代码。我有以下代码:

class Class1: UIStackView {

    var variable1 = "value1"

    override init(frame: CGRect){
      super.init(frame: frame)
    }

    required init?(coder aDecoder: NSCoder){
      super.init(coder: aDecoder)
    }

    setUpStackView(value: variable1)

}

class Class2: UIStackView {

    var variable2 = "value2"

    override init(frame: CGRect){
      super.init(frame: frame)
    }

    required init?(coder aDecoder: NSCoder){
      super.init(coder: aDecoder)
    }

    setUpStackView(value: variable2)

}




extension Class1 {

  func setUpStackView(value: String){
    //code to set UIStackView rating control and to use the variable value
  }

}

如何实现Class2的扩展名?我坚持这一点。任何帮助将不胜感激!

swift class protocols extension-methods
2个回答
0
投票

一个解决方案可以将通用代码移至您可以抽象出的协议中

protocol  BaseStackView {
    var variable :String { get set }
}

class Class1: UIStackView,BaseStackView {



    var variable = "value1"

    override init(frame: CGRect){
      super.init(frame: frame)
        self.setUpStackView(value: variable)

    }

    required init(coder: NSCoder) {
        super.init(coder: coder)
        self.setUpStackView(value: variable)
    }
}

class Class2: UIStackView,BaseStackView {

    var variable = "value2"

    override init(frame: CGRect){
      super.init(frame: frame)
        self.setUpStackView(value: variable)
    }

    required init(coder: NSCoder) {
        super.init(coder: coder)
        self.setUpStackView(value: variable)
    }



}



extension UIStackView {
    func setUpStackView(value: String) {
        //Your setup here
    }
}

0
投票

您有一些选择。

您可以使Class2从Class1继承:

class Class2: Class1 {
    var variable2 = "value2"
    setUpStackView(value: variable2) //But there's a problem here
}

但是当您处于类声明的中间时,您不能只调用一个函数。但是您可以在初始化程序中执行此操作:

class Class2: Class1 {
    var variable2 = "value2"

    override init(frame: CGRect) {
        super.init(frame: frame)

        setUpStackView(value: variable2) 
    }

    required init?(coder aDecoder: NSCoder){
        super.init(coder: aDecoder)

        setUpStackView(value: variable2) 
    }
}

上面的内容有点讨厌,因为您是在其自己的初始化程序中引用类属性。这是另一个解决方案:

您可以使您的设置功能成为UIStackView的功能扩展:

extension UIStackView {
    func setUpStackView(value: String) { 
        //Your setup here
        self.someProperty = value //self is referring to the stackview itself
    }
}

另一个选择是创建静态函数。

extension Class1 {
    static func setUpStackView(stackVw: UIStackView, value: String) {
        stackVw.someProperty = value 
        //Doing it like this still makes this function "belong" to Class1
        //It also makes it so anyone can set up their stack view like
        //this because they have to pass their stack view in here
    }
}

用法将是这样:

override init(frame: CGRect) {
    super.init(frame: frame)
    Class1.setUpStackVw(stackVw: self, value: self.variable)
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    Class1.setUpStackVw(stackVw: self, value: self.variable)
}
© www.soinside.com 2019 - 2024. All rights reserved.