I used the debugger in Xcode. After seeing the same odd behavior you wrote about, and reading this line of your post:
I first put a breakpoint in TextFieldShouldClear, on this line:
doneBarButton.isEnabled = false
It hit that line every time I hit Clear, even when the final result was the Done button still being enabled.
So then I found the other place where doneBarButton.isEnabled gets changed, in the method
func textField(_ textField: UITextField, shouldChangeCharactersIn range...
I put a breakpoint on that code as well. Sure enough, the second time I tapped Clear, first textFieldShouldClear got called, making isEnabled = false, then shouldChangeCharactersIn got called, with the autoCorrect value as the text, and isEnabled got set to true.
Then I just played around with making entries with or without an autocorrect, and tapping Clear, until I could say what sequence would leave the Done button enabled after tapping Clear.
It’s a pretty subtle bug. I first did the Checklist app in October 2017, and I never noticed it, nor did anyone else! It occurs because shouldChangeCharactersIn is called before the change, since you can return False to tell it not to make the change. Technically speaking, the Done button enable/disable should happen after the change, not before.
Since the UITextFieldDelegate doesn’t have a call after the change, I hunted around and found the notification called UITextFieldTextDidChange (Did = after). Notifications are a bit more advanced, but I think there is at least one later on in the Apprentice (p 707). They are an older part of iOS, and very complete, but a bit more cumbersome to use.