雖然這篇Isequal MATLAB鄉民發文沒有被收入到精華區:在Isequal MATLAB這個話題中,我們另外找到其它相關的精選爆讚文章
在 isequal產品中有1篇Facebook貼文,粉絲數超過2萬的網紅紀老師程式教學網,也在其Facebook貼文中提到, [學員來信回覆] 『饕客』與『漁夫』 以下是那位先前我說過,這一期 iPhone / iPad 程式設計班用功到我立正致敬的學員,昨天問我的問題。今早抽空回覆他後,覺得裡面有些程式抓錯(Debug)邏輯與技巧,很值得分享給大家知道,所以就貼上來了。如果您沒學過 iPhone / iPad 程式設計...
同時也有10000部Youtube影片,追蹤數超過2,910的網紅コバにゃんチャンネル,也在其Youtube影片中提到,...
isequal 在 紀老師程式教學網 Facebook 的最佳貼文
[學員來信回覆] 『饕客』與『漁夫』
以下是那位先前我說過,這一期 iPhone / iPad 程式設計班用功到我立正致敬的學員,昨天問我的問題。今早抽空回覆他後,覺得裡面有些程式抓錯(Debug)邏輯與技巧,很值得分享給大家知道,所以就貼上來了。如果您沒學過 iPhone / iPad 程式設計,對於原始碼說明那部分可以無視跳過去,但前頭的「除錯邏輯」麻煩您看一看,應該會有幫助。下次發生「某功能跑不出來」,就不會只是像無敵風火輪裡的天竺鼠一般,「怎麼辦怎麼辦」地窮轉而徒勞無功了。
什麼?你問我這跟『饕客』與『漁夫』有什麼關係?哈哈哈!你看完就知道了。
----------------
[學員來信部分]
Hi,老師
秀不出來,是if的判斷式有錯?
(紀老師:是的,以下就沒了,就像你跟醫師說完「我咳嗽」,其它問題都回答「不知道」是一樣的)
[紀老師回信部分]
您好:
其實寫程式的「抓錯(Debug)」跟醫師診斷病因有異曲同工之妙。病人跟你說:「我咳嗽」,你就得靠經驗用「消去法」,刪除不可能的病因,直到只剩一條病因、並驗證就是這條病因導致為止。
同樣的,您說「秀不出來」,這可以分為幾個可能「病因」去檢查:
(1) 根本沒有觸發該函數(也就是說,沒有綁定)。
(2) 觸發該函數了,可是沒執行我們想要它執行的程式碼。
(3) 觸發該函數,我們想要它執行的程式碼也執行了,但是因為程式邏輯可能有誤,導致執行結果一片空白,變成「秀不出來」。
以上的「思維」,對於將來「XXX 功能『跑不出來』」這種情況一體適用。所以,上面的幾條「斷診邏輯」,麻煩您要絕對緊記在心。下次就不會只是兩手一攤說「秀不出來」,而是「我的函數有觸發,程式碼也執行了,但就是秀不出來。老師可以幫我看看我的程式邏輯哪裡有錯誤嗎?」對我來說,後者問問題的「段數」,比前者高了很多(以上我嘗試著把你從吃魚的「饕客」,變成抓魚的「漁夫」)。
如果想要檢查出 (1) 與 (2) 很簡單,只要多加兩個 NSLog() 就可以了。如下所示:
-(void) show:(UIButton *) sender
{
NSLog(@"Enter (void) show"); // 第一個 NSLog()
if ([btnShow.titleLabel isEqual: @"Show"]) {
NSLog(@"Enter if-statement"); // 第二個 NSLog()
lblShow = [[UILabel alloc]initWithFrame:CGRectMake(120,200,100,20)];
lblShow.text = @"Hello World!";
lblShow.backgroundColor = [UIColor lightGrayColor];
[self.view addSubview:lblShow];
[btnShow setTitle:@"Hide" forState:UIControlStateNormal];
}
}
我執行後發現,第一個 NSLog 有執行,但第二個 NSLog 沒執行。所以,函數有觸發,(1) 號病因不成立。(2) 號病因成立。
明明 btnShow 上面的 Title Label 就是 Show 啊?為什麼 if 會不成立,導致 (2) 號病因成立呢?這時你就有能力把眼睛「完全聚焦」在 if (…) 那一段,解開後,整個問題就解開了。仔細看後發現,你的屬性用錯了。 btnShow.titleLabel 的型別是 UIButton,而 UIButton 的 isEqual,根據使用說明書提示,是判斷該 UIButton 的「識別字(Identifier)」是否為 @"Show",而不是 UIButton 上的表面文字是否為 @"Show"。所以,程式碼應該寫成:
-(void) show:(UIButton *) sender
{
NSLog(@"Enter (void) show");
if ([btnShow.titleLabel.text isEqualToString: @"Show"]) {
NSLog(@"Enter if-statement");
lblShow = [[UILabel alloc]initWithFrame:CGRectMake(120,200,100,20)];
lblShow.text = @"Hello World!";
lblShow.backgroundColor = [UIColor lightGrayColor];
[self.view addSubview:lblShow];
[btnShow setTitle:@"Hide" forState:UIControlStateNormal];
}
}
您應該比對的是 titleLabel 的 .text,不是 titleLabel 本身。
至於按下「Hide」按鈕後,怎麼讓原來的字不見,您就得多加個 else 或 else if 了。在 else { … } 內先把 lblShow 隱藏,然後把 btnShow 的 title 改回 @"Show"。這個就留給你自己補上了。
雖然我只花了 5 秒就知道問題在哪裡(因為這種錯我也常犯,習慣了),但是我願意花 20 分鐘打這些字,希望你將來能變成「5 秒就知道問題在哪裡」的人,哪天也可以很驕傲地教別人如何 Debug。這是我最大的期望。
-----------------------------------
紀俊男(Robert Chi)