2014-12-10 13 views
5

Esiste una sintassi alternativa per le stringhe in Swift? Ho bisogno di copiare/incollare blocchi di testo tra cui molte virgolette e sfuggirle ogni volta è una specie di dolore.Sintassi simil-heredoc dalle stringhe in Swift

Sto cercando qualcosa come la sintassi di PHP heredoc o le stringhe triple citate di Python. Simile a this question, ma non mi interessa le nuove righe, ho solo bisogno di ignorare le virgolette e le barre rovesciate.

Ecco un esempio concreto del disastro che sto affrontando in questo momento:

let pattern = "(?:\["(this|is|a|pain|to|escape|properly)+)",0(?:,\[10\])?\])" // that makes me sad 
let json = "window.google.ac.h(["this",[["is",0],["even",0],["worse",0]],{"q":"...","k":1}])" // that makes me cry 

Grazie.

+0

sarebbe alcun senso di metterli in una risorsa di stringa o un file plist, invece? Questa è spesso una buona soluzione per questa categoria di problemi. –

+0

@MattGibson bene, sto solo usando questo nei campi da gioco per il debug, non sono sicuro che possano persino accedere alle risorse. Per l'app di produzione i dati provengono da un servizio Web, quindi non è un problema. –

+0

È possibile [leggere i file di risorse da un parco giochi] (http://stackoverflow.com/questions/24245916/how-can-i-read-a-file-in-a-swift-playground) -si può memorizzare la risorsa file accanto al file del parco giochi e caricare le cose da lì bene. Certo, non so quanto dolore sarebbe per il tuo particolare flusso di lavoro! –

risposta

6

As with Objective C, there's no syntax for this in the language. Le stringhe devono solo essere sfuggite, almeno al momento. L'alternativa è caricare la stringa da un file di risorse.

Avrei sollevato un bug report con Apple su questo; sarebbe utile per la lingua, più che con l'Objective C, solo per i motivi che stai riscontrando: Swift può essere eseguito in modo più dinamico, in un campo da gioco/REPL, quindi c'è più motivo per voler incollare materiale arbitrario in costanti di stringa mentre stai giocando.

Addendum: Come esercizio di hacking rapido, ho appena inserito una voce di menu Servizi rapida e sporca in Automator per la citazione di stringhe in un parco giochi. Ciò va oltre lo scopo di questa risposta Overflow stack, ma I documented it on my blog.

+1

C'è una ragione per cui non hai menzionato il motivo per cui la sintassi di heredoc sarebbe buona; allo stato attuale, la costruzione di una lunga stringa "aggiungendo" le stringhe insieme in codice porta Swift completamente in ginocchio. Il modo _lyly_ che ho trovato per caricare un paragrafo di testo complesso in una variabile è quello di ottenerlo da un file di risorse. Farlo nel codice sorgente non è solo maldestro - rompe letteralmente il codice sorgente, facendo esplodere il compilatore. – matt

+1

Sì, abbiamo bisogno di più persone per archiviare i radar su questo. La scarsa gestione di grandi stringhe da parte di Swift è un grosso problema e deve essere risolta. Apple ne è ovviamente consapevole, ma ulteriori reclami si tradurranno in una soluzione più rapida. Quale di questi preferisci? https://gist.github.com/abhibeckert/b12e19a85c4806296c7e –

+0

@matt In realtà non avevo bisogno di farlo, quindi non avevo notato il compilatore che scricchiolava sotto il peso. Ma ci sono state volte in praticamente tutte le lingue che ho usato che mancano di una sintassi di heredoc in cui sono stato davvero infastidito da quella mancanza. Metterò "file un radar" nella mia lista delle cose da fare per domani. –

3

Swift non lo supporta, ma C++11 does. E possiamo facilmente importarlo in Swift, come NSString s.

StringConst.h:

#import <Foundation/Foundation.h> 

extern NSString *const STR_PATTERN; 
extern NSString *const STR_JSON; 

StringConst.mm:

#import "StringConst.h" 

NSString * const STR_PATTERN = @R"""((?:\["(this|is|a|pain|to|escape|properly)+)",0(?:,\[10\])?\]))"""; 
NSString * const STR_JSON = @R"""(window.google.ac.h(["this",[["is",0],["even",0],["worse",0]],{"q":"...","k":1}]))"""; 

<target> -Bridging-header.h:

#import "StringConst.h" 

AnySwift.swift:

println(STR_PATTERN) 
println(STR_JSON) 

Aggiunto:

di utilizzare questo nel parco giochi, è necessario creare un progetto quadro, e il file di giochi in esso.

sceenshot

+2

Purtroppo, questo non è di grande aiuto in un parco giochi, per quanto posso vedere. Speriamo che Swift raggiunga C++ 11 più velocemente di C++ ... –

+0

Oops, non ho letto i commenti OP :( – rintaro

+0

Penso che questa possa ancora essere una tecnica utile, ed è sicuramente una risposta valida all'originale –

Problemi correlati