我是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
的扩展名?我坚持这一点。任何帮助将不胜感激!
一个解决方案可以将通用代码移至您可以抽象出的协议中
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
}
}
您有一些选择。
您可以使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)
}