2015-05-05 7 views
6

Czy istnieje sposób, aby zmienić ciąg znaków w blok kodu? Robię żądanie Ajax do mojej strony internetowej, która ma punkt końcowy, który zwraca krótki kod jako ciąg. Mogę uzyskać ten kod z powrotem jako ciąg, ale nie mogę uruchomić tego kodu, ponieważ nie wie, że jest to kod.Czy mogę zamienić ciąg znaków w blok kodu w szybkim tempie?

+3

Nie programistą Swift, ale z różnych względów brzmi to jak zły pomysł: 1 - jeśli kanał zostanie przejęty, osoba atakująca może sprawić, że Twoja aplikacja będzie wykonywała trywialny kod trywialnie. 2- Jeśli jest to aplikacja App Store, Apple odrzuci ją, ponieważ uniemożliwia ona pobranie kodu wykonywalnego. 3 - Musisz mieć swoją aplikację skompilować kod, który może być powolny/niemożliwe, w zależności od urządzenia. Ostatecznie, powinieneś umieścić ten kod w swojej aplikacji i niech twój serwer wyśle ​​ci wiadomość informującą aplikację, jaki kod uruchomić. –

Odpowiedz

10

Nie, nie możesz tego zrobić. Swift jest językiem kompilowanym, a nie interpretowanym jako Ajax.

Kompilator Swift działa na komputerze Mac, a nie na urządzeniu z systemem iOS. (To samo dotyczy Objective-C).

Ponadto, wytyczne sklepu Apple App Store zabraniają dostarczania kodu wykonywalnego do aplikacji, więc nawet jeśli zorientujesz się, jak to zrobić, Twoja aplikacja zostanie odrzucona.

10

Jak podkreślali inni, jeśli tworzysz aplikację na iOS (szczególnie do dystrybucji w sklepie z aplikacjami), nie możesz tego zrobić. Jeśli jednak piszesz kod Swift dla komputera z systemem OS X i wiesz, że XCode jest zainstalowany na komputerze, możesz uruchomić łańcuch kodu Swift, uruchamiając kompilator Swift z linii poleceń. Coś jak to (z właściwego sprawdzania błędów, oczywiście):

var str = "let str = \"Hello\"\nprintln(\"\\(str) world\")\n"  

let task = Process() 

task.launchPath = "/usr/bin/swift" 

let outpipe = Pipe() 
let inpipe = Pipe() 
inpipe.fileHandleForWriting.write(str.data(using: String.Encoding.utf8, allowLossyConversion: true)!) 
task.standardInput = inpipe 
task.standardOutput = outpipe 
task.launch() 
task.waitUntilExit() 
task.standardInput = Pipe() 

let data = outpipe.fileHandleForReading.readDataToEndOfFile() 

let output = NSString(data: data, encoding: String.Encoding.utf8.rawValue)! as String 

Ponownie, to prawdopodobnie nie jest w prawie wszystkich przypadkach rzeczywistych zalecane, ale jest sposobem można wykonać ciąg kodu SWIFT, jeśli ciebie naprawdę trzeba.

Powiązane problemy