A standard transaction with two inputs and two outputs could do a secure swap.
input 1: Alice output 1: Bob (new address)
input 2: Bob output 2: Alice (new address)
Alice signs her input and Bob signs his. The transaction isn't valid until they both sign.
It would be more interesting with a larger group:
input 1: user1 output 1: user3
input 2: user2 output 2: user2
input 3: user3 output 3: user6
input 4: user4 output 4: user5
input 5: user5 output 5: user1
input 6: user6 output 6: user4
This is actually simple compared to the mind bending stuff in the wiki Contracts article:https://en.bitcoin.it/wiki/Contracts
I've been reading that article, and it seems like there might be a way to swap using two separate transactions, without revealing they're related. If I figure that out I'll post.