This could possibly be a duplicate question, but after reading (a lot) of different solutions, none of them seemed to clarify an important piece of the puzzle when trying to resolve this issue and I think it will be constructive to shed some additional light on this problem.
TL;DR
Either use titleForHeaderInSection in conjunction with viewForHeaderInSection or create and return a UILabel in viewForHeaderInSection and set the height of the header in heightForHeaderInSection.
More thorough explanation
The Root of the Problem:
I was unable to change the text attributes because of an inappropriate use of willDisplayHeaderView. This is because this function should only be used after a UIView (or subclass of UIView) for the header has already been instantiated elsewhere. The header view does not get created unless done so through titleForHeaderInSection or viewForHeaderInSection.
Referring to titleForHeaderInSection From the docs:
Return Value
A string to use as the title of the section header. If you return nil , the section will have no title.
So, the million dollar question: Why couldn't I change the text in viewForHeaderInSection or willDisplayHeaderView unless I also set the text for a section header in titleForHeaderInSection?
Turns out this is a trick question! Sort of.
In the case of using viewForHeaderInSection, the text actually is getting changed - you just can't see it. When you set the text of a section title with titleForHeaderInSection, swift automatically creates a UITableViewHeaderFooterView with a default height constraint for that particular section. Another option for creating a header view is to create and return a class of type UIView in viewForHeaderInSection, however the caveat here is that a default height constraint does not get created, thus you end up with a UIView container with a height of zero and it will not display onscreen - but this is easily remedied by giving it some height by overriding heightForHeaderInSection.
In the case of using willDisplayHeaderView, the problem existed as a result of incorrectly implementing that function. A header of class type UIView must be created either through returning a non-empty string value in titleForHeaderInSection or returning an object of class type UIView in viewForHeaderInSection before willDisplayHeaderView should be used. This is because the parameter named "view" in that function must already exist before you can change it's properties. Seems kind of like a no-brainer.
Solution 1
Simply make sure you return a non-empty string value from titleForHeaderInSection; doing so will ensure that a header view object is instantiated. Use viewForHeaderInSection to set the properties of the header to your liking.
Solution 2
Override the function viewForHeaderInSection and create a new object that inherits from UIView (aka, UILabel, UITableViewHeaderFooterView, UIImageView, or whatever fits your fancy). Return that object, and then (very important!) set the height of the header in heightForHeaderInSection. There is no need to use titleForHeaderInSection with this approach.
There are several other solutions I was able to come up with, but these two are really the only ones that make any sense. And of course, if you are happy with the way your section headers look using Apple's default scheme, save yourself all the trouble and use titleForHeaderInSection exclusively.