從100 Days of Swift中學(xué)習(xí)矛纹,實(shí)踐
????目前正在學(xué)習(xí)swift ,之前有一些好高騖遠(yuǎn), 剛剛接觸螃诅,并且了解了一部分語法后就因?yàn)樽约涸贠C上使用reactiveOBJC還算熟練,想直接學(xué)會(huì)rxswift和reactiveswift 状囱,中間因?yàn)閤code有時(shí)候索引失效和一些其他原因术裸,想過放棄學(xué)習(xí),無意中看到?關(guān)于iOS學(xué)習(xí)進(jìn)階的必讀一些博客總結(jié)?這個(gè)文章時(shí)看到了 100 Days of Swift亭枷, 感覺從一次次項(xiàng)目中袭艺,更加能夠堅(jiān)實(shí)我的基礎(chǔ), 所以決定從基礎(chǔ)開始叨粘,跟著一步步往前走
第一天:
用了20分鐘把這個(gè)弄完猾编, UI很容易瘤睹, 但是Swift和OC太多不一樣,還花了20分鐘
用到的知識(shí)點(diǎn):
1.手勢(shì):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 的時(shí)候,不了解Selector在Swift中使用,導(dǎo)致崩潰苇羡。
#selector和Selector()區(qū)別
#selector (self.funcName)? ? ? ?self 作用域 funcName 方法名绸吸。當(dāng)前作用域只有唯一方法時(shí) 可以省略作用域
????#selector ()? ?能夠代替字符串明確構(gòu)造 Selector? 直接索引出當(dāng)前作用域的方法,不會(huì)出現(xiàn)[unrecognized selector sent to instance] 崩潰的bug ,更加安全 设江。但是在使用#selector()的時(shí)候锦茁, 如果方法是Swift的私有方法, 則需要賦予該方法? OC的runtime特性 在前面加入修飾詞 @objc
Selector()? ??
? ???填寫字符串來搜索方法叉存÷肓可能會(huì)出現(xiàn)找不到方法而崩潰的問題, 書寫效率也不夠高效歼捏。但是在某些情況下能夠起到作用稿存。比如:父類有一個(gè)私有方法 show, 子類通過#selector 是無法調(diào)用父類中的show方法的瞳秽, 但是Selector 可以通過 字符串匹配到方法瓣履,并且調(diào)用
2.KVO
oc:一般直接給觀察的那個(gè)屬性賦新值 就會(huì)觸發(fā)
這是因?yàn)?oc具有運(yùn)行時(shí)機(jī)制,并且繼承的NSObject類练俐,而NSObject類實(shí)現(xiàn)了willChangeValueForKey袖迎、didChangeValueForKey能夠在運(yùn)行時(shí)派生一個(gè)子類正常執(zhí)行。
swift:?
1腺晾,給屬性前面加上 關(guān)鍵字 dynamic?
2 燕锥,使用setvalue for key 可以觸發(fā)
swift本身屏蔽了運(yùn)行時(shí)機(jī)制,沒有運(yùn)行時(shí)就沒有派生類悯蝉。沒有派生類归形,就沒有重寫set get方法。沒有重寫set方法 鼻由,就沒有調(diào)用類本身的 setvalue for key 來 觸發(fā)kvo通知觀察者暇榴。so 要么加上關(guān)鍵字?dynamic獲取動(dòng)態(tài)性、要么直接使用setvalue for key來觸發(fā)kvo嗡靡。
還有就是在observeValue 方法中不會(huì)使用?[NSKeyValueChangeKey : Any] 跺撼。?
? if let value = change?[NSKeyValueChangeKey.newKey] as? Int {
? ? ? ? ? ? ? ? DispatchQueue.main.async{
?? ? ? ? ? ? ? ? ? ? self.NumberLable.text="\(value)"
}
問題首先沒有加入as?Int? 然后斷點(diǎn)打印的時(shí)候 po??change?[NSKeyValueChangeKey.newKey] 會(huì)報(bào)找不到description讨彼。