Swift学习记录 Day 1

2018-02-03  本文已影响0人  那不是随你

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中使用,导致崩溃。

#selectorSelector()区别

#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。


上一篇下一篇

猜你喜欢

热点阅读