2015-05-05 15 views
6

Gibt es eine Möglichkeit, eine Zeichenfolge in einen Codeblock umzuwandeln? Ich mache eine Ajax-Anfrage an eine Webseite von mir, die einen Endpunkt hat, der schnellen Code als String zurückgibt. Ich kann diesen Code als String zurückbekommen, aber ich kann diesen Code nicht ausführen, weil er nicht weiß, dass es Code ist.Kann ich einen String schnell in einen Codeblock umwandeln?

+3

Kein Swift-Programmierer, aber das klingt aus mehreren Gründen wie eine schlechte Idee: 1- Wenn der Kanal kompromittiert ist, kann ein Angreifer Ihre App dazu bringen, willkürlichen Code trivial auszuführen. 2- Wenn es sich um eine App Store-App handelt, lehnt Apple diese ab, da der Download von ausführbarem Code nicht zulässig ist. 3- Sie müssten Ihre App kompilieren, die je nach Gerät langsam/unmöglich sein könnte. Letztendlich sollten Sie diesen Code in Ihre App einfügen und sich von Ihrem Server eine Nachricht senden lassen, die der App mitteilt, welcher Code ausgeführt werden soll. –

Antwort

10

Nein, das geht nicht. Swift ist eine kompilierte Sprache, die nicht wie Ajax interpretiert wird.

Der Swift-Compiler läuft auf Ihrem Mac, nicht auf dem iOS-Gerät. (Dasselbe gilt für Objective-C).

Darüber hinaus verbieten Apples App-Store-Richtlinien die Bereitstellung von ausführbarem Code für Ihre Apps. Selbst wenn Sie einen Weg finden, dies zu tun, wird Ihre App abgelehnt.

10

Wie andere darauf hingewiesen haben, können Sie dies nicht tun, wenn Sie eine iOS-App erstellen (insbesondere für die Verteilung im App Store). Wenn Sie jedoch Swift-Code für eine OS X-Maschine schreiben und wissen, dass XCode auf der Maschine installiert ist, können Sie Ihre Swift-Codefolge ausführen, indem Sie den Swift-Compiler der Befehlszeile ausführen. So etwas wie dies (mit entsprechender Fehlerprüfung, natürlich):

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 

Auch dies ist wahrscheinlich nicht in fast allen realen Fällen zu empfehlen, aber es ist eine Möglichkeit, Sie einen String von Swift Code ausführen können, wenn Sie wirklich müssen.

Verwandte Themen