2016-02-29 34 views
1

此問題是由調試器打印分配給枚舉的關聯值造成的。有自定義描述時可以阻止這種情況嗎?對於這個微不足道的例子來說,這不是什麼大不了的事情,但是如果你有字典或者其他大型對象,它可能真的會污染po輸出。如何覆蓋lldb po命令打印的內容,用於快速枚舉?

我有一個簡單的快速枚舉。我試圖覆蓋在調試器中執行po命令時所打印的內容。但是,lldb正在打印對象的description,然後是該枚舉的轉儲。例如,假設下面的代碼:

enum TestEnum : CustomStringConvertible { 
    case Value1(test:Int) 

    var description: String { 
     return "Test Enum" 
    } 
} 

當我嘗試打印類型TestEnum的對象,或者當它嵌套在被帶來打印另一個對象,我得到這個類型的輸出:

(lldb) po testEnum 
▿ Test Enum 
    - Value1 : 1000 

我只想要我的說明在對象顯示在調試器中時打印。我也試過通過debugDescription這樣做,結果相同。

+0

我不確定你在說什麼?在調試器中,我要求「po response.value!」這是可選的類型。在另一個例子中,我也嘗試覆蓋debugDescription,但得到了相同的結果。據我所知,lldb正在打印自定義描述,然後繼續爲枚舉進行內部默認打印。 –

+0

是的,謝謝你指出。我決定取消前面的例子並粘貼一個簡單的例子。這幫助我確定它在做什麼。它將打印與枚舉關聯的每個指定值的值。這是我想要嘗試和預防的。 –

+0

好的,謝謝你。沒有依賴關係的簡化示例構成了一個MCVE,並給了我一些東西來吸引我的注意力。 :) – matt

回答

1

你在某種程度上比較蘋果和橘子。 po和CustomStringConvertible沒有真正密切相關。

CustomStringConvertible和description指示將對象轉換爲String(因此名稱)時看到的內容。所以在調試器中你想要做的就是說po String(testEnum)。 (或不使用LLDB可言,只是打印到正在運行的程序的控制檯,使用print(testEnum),這真的是CustomStringConvertible是。)

顯示,當你說po testEnum與枚舉是如何辦反映了。如果你不喜歡那樣,你會想實現CustomReflectable - 但我不相信你真的想這樣做,就像我在一會兒會爭辯的那樣。首先,例如:

enum TestEnum : CustomStringConvertible, CustomReflectable { 
    case Value1(test:Int) 

    var description: String { 
     return "Test Enum" 
    } 

    func customMirror() -> Mirror { 
     return Mirror(reflecting:self.description) 
    } 

} 

現在po testEnum將產生Test Enum。但爲什麼?你真的想丟掉現在enum給你的燦爛鏡像嗎?在斯威夫特的整個第一年,我們抱怨po在一個枚舉上根本沒有提供任何信息,甚至不是什麼情況;在這裏您不僅可以瞭解該案例,還可以瞭解該案例的相關價值。似乎非常逆行,而不是說自我挫敗,想要消除這種情況。

+0

其中一個相關的值是一個字典,它可能在顯示時相當大。我使用自定義描述很好地打印了此字典的內容。字典的默認打印很難看,也很難閱讀。所以基本上,打印時,我會看到一個非常格式化的打印,然後是一個非常醜陋的打印。又名,對象正在被打印兩次。 –

+0

我很關心實現customMirror只是爲了在調試器中有很好的輸出。所以可能不會這樣做。但非常感謝。 –

+0

是的,我建議說'po String(...)',然後繼續前進。 :) – matt