Imprimir todas las combinaciones de una cadena

iOS 11, Swift 4.0

Intentando escribir una función recursiva para mostrar todas las combinaciones posibles de una cadena. Obtuve esto, pero no está del todo bien ya que solo obtengo 20 pares y debería obtener 24. No puedo ver lo que me he perdido aquí.

¿Dónde va mal esta codificación?

var ans:Set<String>!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    let str = "ABCD"
    ans = []
    recursiveString(s2s: str, char2s: 0)
    print("\(ans) \(ans.count)")
}

func recursiveSwap(s2x: String, c2x: Int, j2m: Int) {
    var anschr = Array(s2x)
        let tmpchr = anschr[c2x]
        anschr[c2x] = anschr[c2x+j2m]
        anschr[c2x+j2m] = tmpchr
        print("\(String(anschr))")
            ans.insert(String(anschr))
        if (c2x + j2m + 1) < s2x.count {
            recursiveSwap(s2x: String(s2x), c2x: c2x, j2m: j2m+1)
        } else {
            if (c2x + 1) < s2x.count - 1 {
                recursiveSwap(s2x: String(anschr), c2x: c2x + 1, j2m: 1)
            }
        }
}

func recursiveString(s2s: String, char2s: Int) {
    let blue = shiftString(s2s: s2s)
    if char2s < s2s.count {
        recursiveSwap(s2x: blue, c2x: 0, j2m: 1)
        recursiveString(s2s: blue, char2s: char2s + 1)
    }
}

func shiftString(s2s: String) -> String {
    let str2s = Array(s2s)
    let newS = str2s.suffix(str2s.count - 1)  + str2s.prefix(1)
    return String(newS)
}

Me da ...

CBDA DCBA ACDB ADCB ABDC ABCD DCAB ADCB BDAC BADC BCAD BCDA ADBC BADC CABD CBAD CDBA CDAB BACD CBAD DBCA DCBA DACB DABC

Respuestas a la pregunta(2)

Su respuesta a la pregunta