猴子原创,欢迎转载。转载请注明: 转载自Cocos2Der-CSDN,谢谢!
原文地址: http://www.jb51.cc/article/p-tdefgbcq-vc.html
今天给别人讲个Observable的实现和使用场景,结合Observable-Swift github: https://github.com/slazyk/Observable-Swift 讲了半天貌似还没有特别明白,故写了个简易的实现,讲述了下Observable属性监控机制。
//: Playground - noun: a place where people can play@H_404_8@
import@H_404_8@ UIKit
import@H_404_8@ Foundation
// MARK: - Observable@H_404_8@
class Observable<@H_404_8@T>@H_404_8@ {
// 定义block结构@H_404_8@
typealias Observer =@H_404_8@ T -> @H_404_8@Void@H_404_8@
// 申明一个block,用于数据改变的执行@H_404_8@
private@H_404_8@ var@H_404_8@ observer: Observer?@H_404_8@
// 数据发生变更,则通过observer告知@H_404_8@
var@H_404_8@ value: T {
didSet {
observer?@H_404_8@(value)
}
}
init(_ v: T) {
value =@H_404_8@ v
}
func observe(observer: Observer?@H_404_8@) {
self@H_404_8@.@H_404_8@observer =@H_404_8@ observer
observer?@H_404_8@(value)
}
}
// MARK: - People@H_404_8@
struct PeopleModel {
let@H_404_8@ firstName: Observable<@H_404_8@String@H_404_8@>@H_404_8@
let@H_404_8@ lastName: Observable<@H_404_8@String@H_404_8@>@H_404_8@
init(firstName: String@H_404_8@,lastName: String@H_404_8@) {
self@H_404_8@.@H_404_8@firstName =@H_404_8@ Observable(firstName)
self@H_404_8@.@H_404_8@lastName =@H_404_8@ Observable(lastName)
}
}
// MARK: - Test@H_404_8@
// test1@H_404_8@
let@H_404_8@ people =@H_404_8@ PeopleModel(firstName: "sunny"@H_404_8@,lastName: "liu"@H_404_8@)
people.@H_404_8@firstName.@H_404_8@observe {
newValue in@H_404_8@
print("firstName changed: \(newValue)"@H_404_8@)
}
people.@H_404_8@lastName.@H_404_8@observe {
print("lastName changed: \($0)"@H_404_8@)
}
people.@H_404_8@firstName.@H_404_8@value =@H_404_8@ "sunny2"@H_404_8@
people.@H_404_8@lastName.@H_404_8@value =@H_404_8@ "liu2"@H_404_8@
// test2@H_404_8@
class House {
let@H_404_8@ lableHouseName =@H_404_8@ UILabel()
init() {
}
var@H_404_8@ people: PeopleModel?@H_404_8@ {
didSet {
people?@H_404_8@.@H_404_8@firstName.@H_404_8@observe{
[@H_404_8@unowned self@H_404_8@]@H_404_8@ in self.lableHouseName.text = $0 } } } }@H_404_8@
这样貌似容易理解了,O(∩_∩)O哈哈~