大家看到1的例子,感觉很简单吧
但是计算属性无法扩展,怎么办?
swift给了我们答案,运算符重载,这样的话,class就有了可以计算的能力。
那么就可以创建类似Int,string的类了,甚至更好。
再来一个简单的例子:
let label = RLabel()
var re = Response()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.view.backgroundColor = UIColor.white
label.backgroundColor = UIColor.blue
label.textColor = UIColor.red
label.frame = CGRect.init(x: 50, y: 80, width: 80, height: 30)
self.view.addSubview(label)
let button = UIButton()
button.setTitle("button", for: .normal)
button.setTitleColor(UIColor.black, for: .normal)
button.addTarget(self, action: #selector(addText), for: .touchUpInside)
self.view.addSubview(button)
button.frame = CGRect.init(x: 50, y: 180, width: 80, height: 30)
self.label.re = re
}
@objc func addText(){
re.text = "wyy_click"
}
}
class RLabel:UILabel{
private var _re:Response?
var re:Response?{
set{
_re = newValue
callBack()
}
get{
return _re
}
}
func callBack(){
re?.responseContent({[weak self] in
self?.text = self?.re?.text
})
}
}
typealias responseBlock = () -> ()
class Response:NSObject{
var block:responseBlock?
private var _text:String?
var text:String?{
set{
_text = newValue
block?()
}
get{
return _text
}
}
func responseContent(_ callBack:@escaping responseBlock){
self.block = callBack
}
}
RLabel 封装的view需要在响应做刷新
Response text的响应类,数据双向绑定
通text setter方法出发block,RLabel接受到block完成view刷新
简单好理解,多好。
现在只能做到一对一,还不能做到一对多,还要丰富多个控件(原理不变,还可以方便扩展多个功能)
以这个为基础我们,继续进化吧。哈哈,出发皮卡丘
网友评论