2017-07-11 3 views
0

Ich versuche, eine UUID mit Swift zu generieren. Die offizielle Dokumentation verwirrte mich ein wenig.Generieren von UUIDs mit Swift

Die documentation sagt

init?(uuidString: String) erstellen UUID aus einer Zeichenkette wie „E621E1F8-C36C-495A-93FC-0C247A3E6E5F“.

Bedeutet das, dass die Zeichenfolge, aus der ich die UUID erstellen muss, in diesem Format sein muss?

Für ein Projekt, das ich mache, habe ich eine Zeichenfolge und ich möchte eine UUID speziell für diese Zeichenfolge generieren.

Hier ist, was ich versucht: '? UUID'

import Foundation 

var str = UUID(uuidString: "Hello World") 
print(str.uuidString) 

Das gibt mir den Fehler,

Wert optional Typ nicht ausgepackt; Wolltest du '!' oder '?'?

Ich bin immer noch sehr neu zu Swift und all dies. Ich weiß nicht, was ich in diesem Fall tun soll.

Grundsätzlich muss ich eine UUID speziell für eine Zeichenfolge (wie "Hallo Welt") generieren, und dann möchte ich die UUID verwenden, um die ursprüngliche Zeichenfolge zurückzugeben.

+3

Das Generieren einer UUID aus einer Zeichenfolge ist nicht sinnvoll. Das ist nicht was eine UUID ist. Sie müssen Ihr Ziel erklären. – rmaddy

+2

Es klingt, als ob Sie über einen Zweiweg-Hash sprechen. – rmaddy

Antwort

0

UUID().uuidString wird verwendet, um UUIDs zu generieren. Sie müssen import Foundation verwenden.

Dies ist eine UUID: E621E1F8-C36C-495A-93FC-0C247A3E6E5F

Sie aus "nichts" erzeugt werden, sind sie einzigartig. Wenn Sie eine ID mit einer bestimmten Zeichenfolge generieren und dieselbe ID zu jeder Zeit mit dieser Zeichenfolge generieren möchten, funktioniert eine UUID nicht für Sie.

Ist es möglich, dass Sie nach Base64-Codierung suchen?

Mit Base64, zum Beispiel, können Sie Hello World als SGVsbG8gV29ybGQ=, kodieren und dann SGVsbG8gV29ybGQ= als Hello World dekodieren.

0

Kurze Antwort auf Ihre Fragen:

1) Ja, Sie eine Zeichenfolge in das richtige Format für eine UUID, ähnlich dem Beispiel bieten müssen: Sie sind

UUID(uuidString: "E621E1F8-C36C-495A-93FC-0C247A3E6E5F") 

Der Code mit UUID(uuidString: "Hello World") wird nil zurückgegeben.

2) Es sieht so aus, als ob Sie wirklich die Zeichenfolge verschlüsseln und entschlüsseln möchten. Dazu gibt es viele Informationen und viele Möglichkeiten. Vielleicht möchten Sie mit der Certificate, Key, and Trust Services Programming Guide beginnen.

Update: für alle, hierher zu kommen, weil sie eine tatsächliche UUID generieren müssen -
Am Terminal-Befehlszeile uuidgen eingeben.

Weitere Update: eine UUID programmatisch in Swift zu erzeugen (ab 3.1), dies zu tun:

import Foundation 

let myUUID: String = UUID().uuidString 

Erklärung für die Fehlermeldung:

Beachten Sie die Markierung Frage in der dokumentierte Anweisung:

init?(uuidString: String) 

In Swift, jeder Typ gefolgt von einer ? ist ein optionaler Typ, was bedeutet, dass das Ergebnis entweder einen Wert des angegebenen Typs (UUID hier) oder nichts (nil) enthält.

Durch Klicken auf den Link für die init? Anweisung in der Dokumentation, werden Sie die Discussion section bemerken in der Tat zeigen, ist: für ungültige Strings

Gibt nil zurück.

Sie bekommen die Fehler, da Swift muss gesagt werden, was mit diesen möglichen nil Ergebnissen zu tun.

Sie müssen entweder:

  • Code spezifische Behandlung für die mögliche nil Ergebnis. (Swift stellt die if let und guard Anweisungen für diese, zum Beispiel.) OR
  • "Kraft unwrap" der optionalen Typ. In diesem Fall sagen Sie Swift, dass Sie sicher sind, dass die Ergebnisse NICHT nil sind, indem Sie einen ! folgend dem möglichen nil Element hinzufügen.

In Ihrem Fall „Kraft die optionalen auspackt“ würde wie folgt aussehen:

print(str.uuidString!) 

Natürlich, auch wenn dies kompiliert, ohne die Fehlermeldung, wäre es zum Absturz bringen, wenn die ungültige Zeichenfolge ("Hallo Welt ") kam mit und produzierte eine nil. (Swift mag nicht, wenn Sie über mögliche Werte liegen nil Werte, lol!) Also, seien Sie vorsichtig zu zwingen, nur Werte auszupacken, die Sie sicher sind, werden nicht nil sein!

+0

Ich würde sagen, es ist wahrscheinlich besser, nicht zu erwähnen! als Ihre Standardlösung, obwohl Sie es erwähnen, ist nicht der Weg zu gehen. Ein Beispiel mit implementiertem Wächter hätte einen größeren Wert für jemanden ergeben, der lernt und sich an den schnellen Weg der Dinge gewöhnt. –

+0

Da die spezielle Fehlermeldung des OP, @AntwanvanHoudt, den Begriff * unwrapped * erwähnt, wollte ich die Kraftentfaltung erklären. Ich erwähnte "wenn lassen" und "bewachen", so dass der Leser diese nachschlagen kann, um selbst etwas über sie zu erfahren. Und ich habe ganz klar klargestellt, dass man NICHT auspacken darf, es sei denn, sie sind SICHER, dass ein Wert nicht "Null" ist. – leanne