When bad light halted play with 17 overs left in the day the home side were still 156 runs adrift of England’s first innings score of 575 for nine declared.
Off-spinner Swann and seamer Broad snared three wickets apiece to completely derail the home side’s bid to save the Test.
After Ashwell Prince (16) and Graeme Smith (22) had given the Proteas a decent start, with a first wicket stand of 27, Swann instigated a collapse that saw South Africa lose six wickets for just 23 runs.
Off-spinner Swann struck with his second ball of the innings, when he had Ashwell Prince (16) caught one-handed by Ian Bell at silly point, before he bowled Hashim Amla (6) through the gate with a delivery that turned sharply into the right-handed batsman.
South Africa took tea on 37 for two but if they hoped for a respite after the break they were to be disappointed as Broad tore into their middle-order.
First to go after tea was Jacques Kallis (3) who shouldered arms to a Broad delivery that cut back into the batsman to knock Kallis’ off stump out of the ground.
Broad then claimed two wickets in two balls when he accounted for AB de Villiers (2), trapped leg-before, despite the batsman asking to have the decision reviewed, before the 23-year-old bowled JP Duminy off an inside edge.
At one stage Broad had figures of three for five before he ended the day with figures of three for 18 off nine overs.
Worse was to follow for South Africa as Smith, who had looked reasonably solid during his knock, was out lbw to Swann. Smith also asked for his decision to be reviewed but replays showed the ball hitting his leg stump.
Swann reached the close of play with the admirable figures of three for 22 off 12 overs.
With their team staggering on 50 for six Mark Boucher (20 not out) and Morne Morkel (7 not out) then battened down the hatches in an unbroken 28-run seventh-wicket stand that used up 65 deliveries.
However, with South Africa needing to bat out 98 overs on the final day of the Test, victory looks very much within England’s grasp.
Earlier, 141 runs from Ian Bell allowed England to declare with the visitors holding a 232-run lead on the first innings.
Bell faced 227 deliveries and struck 10 fours and a six before he perished in the search for quick runs.
The visitors showed intent from the moment they returned after lunch and they scored 62 runs in the nine overs they faced after the break.
Broad, who had just struck a six and a four, fell when he edged a delivery from off-spinner Duminy through to Kallis at first slip.
The catch was Kallis’ 150th in Test cricket.
Swann then blazed his way to 22 off 14 balls before being caught at mid-on by a diving Prince off a delivery from speedster Dale Steyn.
Bell was the last England wicket to fall when he flashed at a wide delivery from Steyn to offer up a regulation catch to Boucher behind the stumps.
Duminy ended the innings with figures of three for 89 off 24 overs while fast bowler Morkel captured three for 78 off 31 overs.
England had suffered an injury scare before the start of play when batsman Paul Collingwood dislocated a finger during fielding practise but subsequent scans revealed no fracture.
Teams