如何在Swift中有一个具有以下限制的变量:
UIView
UIView
的直接子类子项(例如,它可能是UIButton的子类)请注意,这类似于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()