2014-12-08 14 views
5

ho bisogno di essere in grado di creare una stringa che è "\b". Ma quando provo, Xcode genera un errore in fase di compilazione: sequenza di escape non valida in letterale. Non capisco perché però, "\r" funziona bene. Se inserisco "\\b", questo è ciò che è effettivamente memorizzato nella Stringa, che non è quello che mi serve - ho bisogno solo di una barra rovesciata. Per me, questa sembra essere una stranezza Swift perché funziona bene in Objective-C.non valido in sequenza di escape letterale: " b"

let str = "\b" //Invalid escape sequence in literal 
NSString *str = @"\b"; //works great 

ho bisogno di generare questa stringa perché "\b" è l'unico modo per rilevare quando l'utente preme 'delete' quando si utilizza UIKeyCommand:

let command = UIKeyCommand(input: "\b", modifierFlags: nil, action: "didHitDelete:") 

Come posso risolvere questo problema?

EDIT: E 'davvero non vuole generare una stringa che è soltanto "\b", questo non funziona - rimane il valore originale:

var delKey = "\rb" 
delKey = delKey.stringByReplacingOccurrencesOfString("r", withString: "", options: .LiteralSearch, range: nil) 
+0

Per inciso, il dispositivo sostitutivo stringa non funziona a causa di Swift, "\ rb" è un carattere ritorno seguito dalla lettera "b" (letteralmente bytes 0D 98). Quella stringa non ha una "r" per sostituire ... –

risposta

8

L'equivalente Swift di \b è \u{8}. Si associa al codice di controllo ASCII 8, proprio come \b in Objective C. Ho provato questo e l'ho trovato a lavorare bene con UIKeyCommand, in this earlier answer of mine.

Esempio frammento:

func keyCommands() -> NSArray { 
    return [ 
     UIKeyCommand(input: "\u{8}", modifierFlags: .allZeros, action: "backspacePressed") 
    ] 
} 
3

Non credo che è supportato.

Sulla base della documentazione Swift https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html:

String literals can include the following special Unicode characters:

The escaped special characters \0 (null character), \ (backslash), \t (horizontal tab), \n (line feed), \r (carriage return), \" (double quote) and \' (single quote)

An arbitrary Unicode scalar, written as \u{n}, where n is between one and eight hexadecimal digits

L'ASCII per il \ b è 8. Se fate la seguente, vedrete questi risultati

let bs = "\u{8}" 
var str = "Simple\u{8}string" 

println(bs) // Prints "" 
println("bs length is \(bs.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))") // Prints 1 
println(str) // Prints Simplestring 

let space = "\u{20}" 

println(space) // Prints " " 
println("space length is \(space.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))") // Prints 1 

str = "Simple\u{20}string" 
println(str) // Prints Simple string 

Sembra che mentre ASCII 8 "esiste", è "ignorato".

+0

Strano! '\ b' è l'unico modo in cui si può sapere che l'utente ha premuto delete quando si usa' UIKeyCommand'. :/ – Joey

+0

Quindi questo è semplicemente impossibile in questo momento, non c'è modo di aggirarlo? – Joey

+0

Scusa amico, è un po 'come quello. Cosa stai cercando di fare con il backspace? Forse c'è un altro modo di finta utilizzando un UITextFields nascosti e qualcosa di simile http://stackoverflow.com/questions/1977934/detect-backspace-in-uitextfield/6637821#6637821. Oppure puoi sempre provare a capire qual è il valore provando qualcosa del genere: https://gist.github.com/steventroughtonsmith/7515380. Puoi vedere cosa viene restituito premendo backspace. –

Problemi correlati