2014-12-10 10 views
5

Czy istnieje alternatywna składnia dla ciągów w Swift? Muszę skopiować/wkleić bloki tekstu, w tym wiele cytatów i uciekać za każdym razem, gdy jest to rodzaj bólu.Składnia podobna do Heredoc z ciągów w Swift

Szukam czegoś w rodzaju składni PHP heredoc lub potrójnych cytowanych ciągów Pythona. Podobny do this question, ale nie dbam o nowe linie, po prostu potrzebuję go, aby zignorować cytaty i odwrotne ukośniki.

Oto konkretny przykład katastrofy Jestem stoi teraz:

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 

Dzięki.

+0

Czy to żadnego sensu, aby umieścić je w ciąg zasobu lub pliku plist zamiast? To często dobre rozwiązanie dla tej kategorii problemów. –

+0

@MattGibson cóż, po prostu używam tego na placach zabaw do debugowania, nie jestem pewien, czy mogą nawet uzyskać dostęp do zasobów. W przypadku aplikacji produkcyjnej dane pochodzą z usługi internetowej, więc nie stanowi to problemu. –

+0

Możesz [odczytać pliki zasobów z placu zabaw] (http://stackoverflow.com/questions/24245916/how-can-i-read-a-file-in-a-swift-playground) - możesz przechowywać zasoby pliki obok pliku na plac zabaw i ładuj z tego miejsca. Oczywiście, nie wiem, ile bólu byłoby dla twojego konkretnego przepływu pracy! –

Odpowiedz

6

As with Objective C, there's no syntax for this in the language. Struny muszą po prostu uciec, przynajmniej w tej chwili. Alternatywą jest załadowanie łańcucha z pliku zasobów.

Na tej stronie podniosę zgłoszenie błędu w Apple; byłoby to pomocne dla języka, bardziej niż z Celu C, tylko z powodów, które znajdujesz: Swift może być wykonywany bardziej dynamicznie, na placu zabaw/REPL, więc jest więcej powodów, aby chcieć wkleić dowolne rzeczy do stałych łańcuchowych podczas gry.

Dodatek: Jako ćwiczenie szybkiego hakowania, właśnie zapukałem szybki i brudny element menu usług w Automatorze, aby cytować ciągi znaków na placu zabaw. Wykracza to poza zakres tej odpowiedzi przepełnienia stosu, ale I documented it on my blog.

+1

Istnieje powód, dla którego nie wspominałeś, dlaczego składnia heredoc byłaby dobra; obecnie konstruowanie długiego łańcucha przez "dodawanie" łańcuchów razem w kodzie powoduje, że Swift całkowicie spoczywa na kolanach. Jedynym sposobem, w jaki znalazłem załadowanie akapitu złożonego tekstu do zmiennej, jest pobranie jej z pliku zasobów. Robienie tego w kodzie źródłowym nie jest po prostu niezgrabne - dosłownie łamie kod źródłowy, wysadzając kompilator. – matt

+1

Tak, potrzebujemy więcej ludzi do zarchiwizowania radarów. Niesprawna obsługa dużych ciągów Swifta jest ogromnym problemem i musi zostać naprawiona. Apple jest oczywiście tego świadomy, ale więcej skarg spowoduje szybsze rozwiązanie. Które z tych preferujesz? https://gist.github.com/abhibeckert/b12e19a85c4806296c7e –

+0

@matt Nie potrzebowałem tego zrobić, więc nie zauważyłem, że kompilator skrzypi pod ciężarem. Ale zdarzały się okresy w prawie każdym używanym przeze mnie języku, w którym brakuje składni heredoc, w której naprawdę byłem zirytowany tym brakiem. Wezmę "plik radaru" na mojej liście rzeczy do zrobienia na jutro. –

3

Swift nie obsługuje tego, ale C++11 does. Możemy go łatwo zaimportować do Swift, jako 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}]))"""; 

<docelowa> -Bridging-header.h:

#import "StringConst.h" 

AnySwift.swift:

println(STR_PATTERN) 
println(STR_JSON) 

Dodano:

Aby to wykorzystać na placu zabaw, trzeba stworzyć projekt ramowego oraz plik zabaw w nim.

sceenshot

+2

Niestety, nie jest to zbyt pomocne na placu zabaw, o ile widzę. Miejmy nadzieję, że Swift dogoni C++ 11 szybciej niż C++ ... –

+0

Ups, nie przeczytałem PO komentarzy :( – rintaro

+0

Myślę, że to wciąż może być przydatna technika i jest to z pewnością poprawna odpowiedź na oryginał pytanie: –