Task#2–1[Debug:Lazy Properties、attempt to insert row 0 into section 0 , but there are only 0 rows in section 0 after the update]
談談Todo-list中遇到的難題
前言
在這次Todo-list中由於要把Massive ViewController切成MyView、ViewController兩塊,花了我不少時間。
以下會將我遇到的問題紀錄在下面
- LazyProperties的特性
- Thread:attempt to insert row 0 into section 0 , but there are only 0 rows in section 0 after the update
正文
1.關於LazyProperties


總之,同樣是在Baby這個類別底下的屬性,由於weight、height都有賦值,所以在這件事情上,bmi並沒有值在裡面,但是,由於class自帶建構器,所以一但你給定屬性一個數值,它就自動被建構完成了,而在上例之中,bmi並沒有被賦值,所以在這裡面,它並沒有被初始化,也會報錯,因為它內部的兩個值:weight、height還沒有被執行,因此它沒有值在裡面。
而lazy的用意就是讓該屬性“被需要”的時候,才被調用、初始化。或許更進一步說,是它並沒有在Run之後就被讀取
因為這樣的設置,所以bmi的計算是被需要的時候,才會初始化,因為它並沒有被賦值。
所以,在Task2中:

tableView這個東西,我目前把它分配於MyView中,MyView裡面包含了跟畫面有關的擴展,而實際上由於畫面要顯示東西出來,需要更新畫面上的cell,所以在ViewController中,有使用tableView.reload會在調用到的時候更新。
Info之所以不能使用lazy屬性的理由,我認為應該是它的資料存放狀態一直都是在使用中的,所以它不能因為lazy而緩速存取資料,也因為它在修改的時候是處於已經賦值的狀態,所以裡面就已經有值了。
2. Thread:attempt to insert row 0 into section 0 , but there are only 0 rows in section 0 after the update


這個問題主要是這樣:tableView並沒有接收到任何的行列,也就是說,有可能是資料傳入出了問題,或者是案件創造的事件沒辦法讓值被顯示在上面。
這邊的錯誤是基於再更新之後,並沒有東西傳入TableView,我剛開始的時候是懷疑TableView有問題,但後來仔細想想,應該是資料儲存、供應端有問題,所以就回去看info的狀況
而當時的info是放在ViewController中,我把它命名成:lazy var infoArray = myView.info
也就是說,我這邊在一開始的時候並不調用它,而是在插入使用過後才調用。但這樣的結果也造成了“在TableView更新之後,傳入零個section、零個row,什麼都沒有。
但我後來把在myView中的info在ViewController之中直接以myView.info的方式進行使用,這就讓整個程式可以順利Run了。

所以,當時出現在這裡錯誤,我想應該就是infoArray什麼都沒有提供給tableView去顯示東西,所以才產生的問題。
所以下次遇到這個問題,大概可以先往資料供應端看看,因為tableView從畫面設定到擴展原則上不會有什麼問題,應該先往資料為什麼沒有顯示來按圖索驥。
小記:
這次的debug經驗其實還算不錯,我覺得是這樣:
- 不要太快去問人找答案,先查查網路上的說法,StackOverFlow會給你震撼教育,有時候看到網友討論這個問題的時候,反而就是個很好的機會去思考與推理問題。
- 羊毛出在羊身上,你的程式碼有問題,要循著Xcode給出的提示去想哪個環節出了問題,進而是推理,像我以為是tableView出問題,但結果是info陣列出問題,那時候原本已經要睡了,但躺下後這個推理的思路不停在我腦袋裡轉,結果爬起來後,真的就把它給解掉了。
參考資料
Swift weak 和 lazy 修飾字
https://franksios.medium.com/swift-weak和lazy修飾字-50f4c7e1b952
Access Control 教學(swift 4, iOS)
https://medium.com/@jerrywang0420/access-control-教學-swift-3-ios-4d93ee567eb0
讓屬性變懶的 swift lazy 咒語
https://medium.com/彼得潘的-swift-ios-app-開發問題解答集/讓屬性變懶的-swift-lazy-咒語-cfcc16840bd2