我有 2 个 View ,它们都有一些共同的属性:
class View1: UIView
{
@IBOutlet weak var button1: UIButton
@IBOutlet weak var button2: UIButton
}
class View2: UIView
{
@IBOutlet weak var button1: UIButton
@IBOutlet weak var button2: UIButton
}
class Utils {
func enableButtons<T>(view: T) {
if view is View1 {
let tempView = view as View1
tempView.button1.enabled = true
tempView.button2.enabled = true
} else if view is View2 {
let tempView = view as View2
tempView.button1.enabled = true
tempView.button2.enabled = true
}
}
}
我如何摆脱通用函数 enableButtons
中的 if-else 语句,使其看起来像下面的内容并且适用于作为参数发送的两个 View :
class Utils {
func enableButtons<T>(view: T) {
view.button1.enabled = true
view.button2.enabled = true
}
}
最佳答案
T
需要受到约束,以便编译器知道参数 view
有两个属性 button1
和 button2
>.
为了做到这一点,您需要使用协议(protocol)。您使用该协议(protocol)来显示两个 View 如何相关。因此,通用 T
可以了解这两个按钮:
protocol TwoButtonView {
weak var button1: UIButton! { get set }
weak var button2: UIButton! { get set }
}
然后,让每个 View 都符合协议(protocol):
class View1: UIView, TwoButtonView
class View2: UIView, TwoButtonView
然后,重写enableButtons
,使T
只能符合TwoButtonView
协议(protocol):
func enableButtons<T: TwoButtonView>(view: T) {
view.button1.enabled = true
view.button2.enabled = true
}
编辑
@DavidBerry 指出,如果您走这条路,则不必使用泛型。相反,您可以这样做:
func enableButtons(view: TwoButtonView) {
view.button1.enabled = true
view.button2.enabled = true
}
关于ios - 创建一个处理通用类型的函数来访问不同 View 的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35519983/