从100 Days of Swift中学习,实践
目前正在学习swift ,之前有一些好高骛远, 刚刚接触,并且了解了一部分语法后就因为自己在OC上使用reactiveOBJC还算熟练,想直接学会rxswift和reactiveswift ,中间因为xcode有时候索引失效和一些其他原因,想过放弃学习,无意中看到 关于iOS学习进阶的必读一些博客总结 这个文章时看到了 100 Days of Swift, 感觉从一次次项目中,更加能够坚实我的基础, 所以决定从基础开始,跟着一步步往前走
第一天:
用了20分钟把这个弄完, UI很容易, 但是Swift和OC太多不一样,还花了20分钟
用到的知识点:
1.手势:tap,longPress事件。
2.KVO
3.GCD DispatchSourceTimer
var codeTimer =DispatchSource.makeTimerSource(queue:DispatchQueue.global())
codeTimer.schedule(deadline: .now(), repeating:0.05)
codeTimer.setEventHandler {
self.totalNum=self.totalNum+1
}
@objc fileprivate func LongPressAction(sender:UIGestureRecognizer){
if sender.state == .began{
codeTimer.resume()
}
else if sender.state == .ended {
codeTimer.suspend()
}
}
deinit {
self.removeObserver(self, forKeyPath: "myDate", context: nil)
codeTimer.resume()
}
直接上代码了
遇到的坑:
1.添加Action 的时候,不了解Selector在Swift中使用,导致崩溃。
#selector和Selector()区别
#selector (self.funcName) self 作用域 funcName 方法名。当前作用域只有唯一方法时 可以省略作用域
#selector () 能够代替字符串明确构造 Selector 直接索引出当前作用域的方法,不会出现[unrecognized selector sent to instance] 崩溃的bug ,更加安全 。但是在使用#selector()的时候, 如果方法是Swift的私有方法, 则需要赋予该方法 OC的runtime特性 在前面加入修饰词 @objc
Selector()
填写字符串来搜索方法。可能会出现找不到方法而崩溃的问题, 书写效率也不够高效。但是在某些情况下能够起到作用。比如:父类有一个私有方法 show, 子类通过#selector 是无法调用父类中的show方法的, 但是Selector 可以通过 字符串匹配到方法,并且调用
2.KVO
oc:一般直接给观察的那个属性赋新值 就会触发
这是因为 oc具有运行时机制,并且继承的NSObject类,而NSObject类实现了willChangeValueForKey、didChangeValueForKey能够在运行时派生一个子类正常执行。
swift:
1,给属性前面加上 关键字 dynamic
2 ,使用setvalue for key 可以触发
swift本身屏蔽了运行时机制,没有运行时就没有派生类。没有派生类,就没有重写set get方法。没有重写set方法 ,就没有调用类本身的 setvalue for key 来 触发kvo通知观察者。so 要么加上关键字 dynamic获取动态性、要么直接使用setvalue for key来触发kvo。
还有就是在observeValue 方法中不会使用 [NSKeyValueChangeKey : Any] 。
if let value = change?[NSKeyValueChangeKey.newKey] as? Int {
DispatchQueue.main.async{
self.NumberLable.text="\(value)"
}
问题首先没有加入as?Int 然后断点打印的时候 po change?[NSKeyValueChangeKey.newKey] 会报找不到description。
网友评论