關(guān)于Swift 你可能連變量都不會(huì)定義

寫在開頭
很多人說寒哥不寫干貨 那今天寒哥就狠狠心 寫個(gè) (其實(shí)不是不寫 是太懶了 平時(shí)都寫在印象筆記中 因?yàn)槭墙o自己看的 格式比較散 要寫博客 就要認(rèn)認(rèn)真真的寫 怕誤了看官的眼 )

  • 順便來個(gè)廣告

iOS開發(fā)者 群532084214 給大家提供一個(gè)交流技術(shù) 也可以聊天打屁的平臺(tái)

此文默認(rèn) 讀者有iOS開發(fā)經(jīng)驗(yàn) 包括OC Swift 和一點(diǎn)點(diǎn)的runtime的理解

先新建個(gè)項(xiàng)目 Swift 和oc都行

新建一個(gè)OCClass:NSObject
我們來聲明一個(gè)成員屬性


Paste_Image.png
Paste_Image.png

所有人都知道定義這都ivar的時(shí)候 系統(tǒng)會(huì)幫你做好幾件事
生成帶下劃線的私有成員屬性 對(duì)應(yīng) 的setter 和getter

那么我們來Swift中看一下怎么定義一個(gè)成員變量

Paste_Image.png

so easy 這個(gè)誰不會(huì)嘛 (我這里不討論可選類型 而是討論 什么叫做存儲(chǔ)變量 什么叫做計(jì)算變量)

我們會(huì)在想 Swift 會(huì)不會(huì)像oc一樣 給我們同樣的生成了 setter 和getter呢
于是有的人會(huì)這樣寫

Paste_Image.png

然后這樣調(diào)用

Paste_Image.png

然后一運(yùn)行程序 Crash了 很多人 會(huì)說 肯定了 不就是循環(huán)調(diào)用
斷點(diǎn)出的堆棧信息 這樣的

Paste_Image.png

很明顯 這就是循環(huán)調(diào)用了 但是你把self.去掉 之后再次運(yùn)行

Paste_Image.png

還是崩

奶奶的要崩潰了 這是什么鬼

其實(shí)Swift設(shè)計(jì)的初衷和oc并不是特別一樣

后文解答

我們先來看一個(gè)mvc的結(jié)構(gòu)圖

Paste_Image.png
Paste_Image.png

其實(shí)在mvc中 View是不能拿到model的 他們互相不知道
但是在開發(fā)過程中 我們很多view的數(shù)據(jù)來源自model 如果我們?cè)谕獠刻峁┮粋€(gè)一個(gè)的屬性 然后等著控制器 去賦值 再在對(duì)應(yīng)的setter里面去 修改view 的顯示 我們會(huì)發(fā)現(xiàn)很累 因?yàn)橐粋€(gè)頁面可能有太多屬性 所以在大多數(shù)情況 我們?cè)趘iew聲明一個(gè)model的屬性 等值控制器去賦值
但是 但是 但是

重要的事情說三遍
我們這樣我違反了 mvc的思想 其實(shí)(mvvm)也是這樣的 view不能拿到model 因?yàn)槟隳玫搅薽odel 就可以修改 就會(huì)造成頁面中的數(shù)據(jù)不對(duì)應(yīng)
大風(fēng)險(xiǎn)啊 于是Swift中出現(xiàn)了 計(jì)算變量這種東西

  • 什么叫計(jì)算變量 還有什么叫存儲(chǔ)變量 丛楚?
    什么鬼

我們聲明了一種變量就是為了存儲(chǔ)數(shù)據(jù) 但是Swift中有一種特殊的變量 叫做 計(jì)算變量 這種變量是 不能存放數(shù)據(jù) (你特么又在逗我 )

看官 我真的沒逗你 是真的 這種變量主要就是為了 在view里面聲明一個(gè)只讀的變量 去來給頁面賦值的 例子

Paste_Image.png

這種辦法就巧妙的 避開了以前在OC開發(fā)iOS時(shí) 可能對(duì)mvc造成的規(guī)則不符的情況

  • 這里出現(xiàn)了其他的情況 就是我真的想擁有一個(gè)變量 還想在setter方法里面做些別的操作

這里我們出現(xiàn)了先入為主的觀念 很多java C++ 和OC開發(fā)者 都以為對(duì)于的setter就是對(duì)應(yīng)的Set方法 其實(shí)不是這樣的額
在Swift中訪問控制是有訪問控制關(guān)鍵字來決定的

Paste_Image.png

對(duì)于的監(jiān)聽方法就變成了這樣

Paste_Image.png

在早期 apple 建議開發(fā)者 都使用 view 使用kvo去觀察model的變化 來給對(duì)于的頁面賦值 但是也不知道程序員的習(xí)慣 還是如何 大家還是我行我素 就在view中拿到model

在Swift中 建議使用計(jì)算變量 來給view賦值

  • 關(guān)于網(wǎng)上對(duì)于計(jì)算變量的寫法
Paste_Image.png

很多人 都模仿 OC中的寫法 自己寫個(gè)帶下劃線的私有變量 然后提供 set和get方法 我只能說你根本就沒有理解Swift 帶著陳舊的思想去學(xué)習(xí) 多此一舉嘛

  • 關(guān)于兩個(gè)問題
  1. 我真的想在計(jì)算屬性里面存值

  2. 屬性觀察期的位置 固定了 那以前的kvo怎么辦

還記得OC中的面試題嗎
category 聲明一個(gè)property 是什么意思
怎么給category增加成員屬性

在oc的category中寫了一個(gè)property 其實(shí)系統(tǒng)幫你做了一個(gè)對(duì)應(yīng)的set 和 get方法的聲明 具體也不會(huì)有私有變量生成 也不會(huì)有方法實(shí)現(xiàn) 如果你真的要加變量 就要用到kvo的 關(guān)聯(lián)對(duì)象 如果你對(duì)runtime不熟悉 去簡(jiǎn)述搜 runtime 很多好文章

Paste_Image.png
Paste_Image.png

在Swift中是這樣的

Paste_Image.png

關(guān)于kvo Swift的初衷就是為了創(chuàng)造幾門極度安全化的語言 所以Swift不建議我們?cè)?使用kvo了 因?yàn)? 在oc中kvo 會(huì)產(chǎn)生 一個(gè)私有的中間類 (不懂去看runtime ) 在Swift 真的想用kvo 就要用黑魔法了

參看自喵神的tips

Paste_Image.png

Paste_Image.png
Paste_Image.png
Paste_Image.png

“在 Swift 中使用 KVO 有兩個(gè)顯而易見的問題。
首先是 Swift 的 KVO 需要依賴的東西比原來多。在 Objective-C 中我們幾乎可以沒有限制地對(duì)所有滿足 KVC 的屬性進(jìn)行監(jiān)聽,而現(xiàn)在我們需要屬性有 dynamic 進(jìn)行修飾耕漱。大多數(shù)情況下憨攒,我們想要觀察的類不一定是 dynamic 修飾的 (除非這個(gè)類的開發(fā)者有意為之,否則一般也不會(huì)有人愿意多花功夫在屬性前加上 dynamic稚失,因?yàn)檫@畢竟要損失一部分性能),并且有時(shí)候我們很可能也無法修改想要觀察的類的源碼飞袋。遇到這樣的情況的話戳气,一個(gè)可能可行的方案是繼承這個(gè)類并且將需”“要觀察的屬性使用 dynamic 進(jìn)行重寫。比如剛才我們的 MyClass 中如果 date 沒有 dynamic 的話授嘀,我們可能就需要一個(gè)新的 MyChildClass 了:”

最后再來個(gè)廣告 受到 公眾號(hào)主人邀請(qǐng) 我的文章也會(huì)被發(fā)布到這個(gè)公眾號(hào)

                        ** 加個(gè)歡迎微信掃碼關(guān)注吧**
Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末物咳,一起剝皮案震驚了整個(gè)濱河市锣险,隨后出現(xiàn)的幾起案子蹄皱,更是在濱河造成了極大的恐慌,老刑警劉巖芯肤,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巷折,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡崖咨,警方通過查閱死者的電腦和手機(jī)锻拘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來击蹲,“玉大人署拟,你說我怎么就攤上這事「璨颍” “怎么了推穷?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)类咧。 經(jīng)常有香客問我馒铃,道長(zhǎng),這世上最難降的妖魔是什么痕惋? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任区宇,我火速辦了婚禮,結(jié)果婚禮上值戳,老公的妹妹穿的比我還像新娘议谷。我一直安慰自己,他們只是感情好堕虹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布柿隙。 她就那樣靜靜地躺著,像睡著了一般鲫凶。 火紅的嫁衣襯著肌膚如雪禀崖。 梳的紋絲不亂的頭發(fā)上捉偏,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天汰规,我揣著相機(jī)與錄音,去河邊找鬼冗美。 笑死,一個(gè)胖子當(dāng)著我的面吹牛掸屡,可吹牛的內(nèi)容都是我干的封寞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼仅财,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼狈究!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起盏求,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤抖锥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后碎罚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體磅废,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年荆烈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拯勉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡憔购,死狀恐怖宫峦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情玫鸟,我是刑警寧澤导绷,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站鞋邑,受9級(jí)特大地震影響诵次,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜枚碗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一逾一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肮雨,春花似錦遵堵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至波丰,卻和暖如春壳坪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掰烟。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工爽蝴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沐批,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓蝎亚,卻偏偏與公主長(zhǎng)得像九孩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子发框,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 本文是投稿文章躺彬,作者:南梔傾寒(博客) 寫在開頭 很多人說寒哥不寫干貨 那今天寒哥就狠狠心 寫個(gè) (其實(shí)不是不寫 ...
    __Lex閱讀 1,041評(píng)論 0 1
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件梅惯、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,058評(píng)論 4 62
  • 我讀完《白鹿原》便產(chǎn)生了一個(gè)疑問:“作家陳忠實(shí)在書中為何多次描寫女人的乳房宪拥?” 我粗略統(tǒng)計(jì)了一下,在這部50萬字的...
    左手夢(mèng)圓閱讀 2,488評(píng)論 1 2
  • 一个唧、標(biāo)準(zhǔn)輸入 標(biāo)準(zhǔn)輸入可以讓用戶輸入一些輸入江解,能夠很好的完成人機(jī)交互设预。在python2.x版本和python3.x...
    轉(zhuǎn)身后的那一回眸閱讀 736評(píng)論 0 0
  • 看見是愛徙歼,聽見也是愛。 最近遇到一個(gè)有點(diǎn)小自暴自棄的小孩子鳖枕。說自暴自棄有點(diǎn)夸大主題魄梯,說小是因?yàn)楹?..
    云木西閱讀 251評(píng)論 0 0