ios - 创建一个处理通用类型的函数来访问不同 View 的属性

标签 ios swift generics swift2

我有 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 有两个属性 button1button2 >.

为了做到这一点,您需要使用协议(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/

相关文章:

ios8,后退按钮在 'NavigationViewController'中消失

ios - 存储 iOS 应用程序的用户密码和用户名

ios - Swift 多项选择输入答案

c# - C# 中的泛型 - 如何创建带有参数的变量类型的实例?

ios - 如何滑动删除表格单元格以在解析时更新?

ios - UITabBarButton 无需切换到另一个 View

尝试使用 FBSDK 快速注销 Facebook 时 iOS 应用程序崩溃

ios - 保存后作为成员的 Realm 对象为零

java - Stream.reduce 的累加器参数中通配符的目的是什么?

c# - 使用泛型 T 确定编译器选择的重载