符合类型和协议的Swift变量

时间:2015-09-03 22:13:37

标签: ios swift

如何在Swift中有一个具有以下限制的变量:

  1. 必须符合特定协议
  2. 它必须是UIView
  3. 的子类
  4. 它不需要是UIView的直接子类子项(例如,它可能是UIButton的子类)
  5. 请注意,这类似于this(无法满足第3点)。

    以下也满足第1点和第2点(但不满足3):

    protocol MyProtocol {
        var onClick: Void -> Void {get set}
    }
    
    class MyCommonView: UIView, MyProtocol {
        var onClick: Void -> Void = {
            println("onClick!")
        }
    }
    
    class MyLittleView: MyCommonView {
    
    }
    
    class MyBigView: MyCommonView {
    
    }
    
    var myView: MyProtocol!
    myView = MyLittleView()
    myView.onClick()
    myView.backgroundColor = UIColor.redColor()  // 'MyProtocol' does not have a member named 'backgroundColor' 
    
    myView = MyBigView()
    myView.onClick()
    myView.backgroundColor = UIColor.redColor()  // 'MyProtocol' does not have a member named 'backgroundColor' 
    

    修改 虽然这类似于this question(并且由@​​zneak回答),但是不必指定我想要使用的所有UIView方法,我希望能够使用他们中的任何一个或全部。

    这是我根据@zneak给出的答案提出的,是否可以改进以便不必指定我想要使用的所有必需的UIView方法?

    protocol MyOnClickProtocol {
        var onClick: Void -> Void {get set}
    }
    
    protocol MyViewProtocol {
        var backgroundColor: UIColor? {get set}
        // And other methods or properties of UIView that I want to access...
    }
    
    class MyLittleView: UIButton, MyOnClickProtocol, MyViewProtocol {
        var onClick: Void -> Void = {
            println("onClick!")
        }
    }
    
    class MyBigView: UISwitch, MyOnClickProtocol, MyViewProtocol {
        var onClick: Void -> Void = {
            println("onClick!")
        }
    }
    
    var myView: protocol<MyViewProtocol, MyOnClickProtocol>!
    myView = MyLittleView()
    myView.onClick()
    myView.backgroundColor = UIColor.redColor()
    
    myView = MyBigView()
    myView.onClick()
    myView.backgroundColor = UIColor.redColor()
    

0 个答案:

没有答案