545 Stimmen

Was bedeutet ein Ausrufezeichen in der Swift-Sprache?

Der Leitfaden zur Swift-Programmiersprache hat das folgende Beispiel:

class Person {
    let name: String
    init(name: String) { self.name = name }
    var apartment: Apartment?
    deinit { println("\(name) wird deinitialisiert") }
}

class Apartment {
    let number: Int
    init(number: Int) { self.number = number }
    var tenant: Person?
    deinit { println("Apartment Nr. \(number) wird deinitialisiert") }
}

var john: Person?
var number73: Apartment?

john = Person(name: "John Appleseed")
number73 = Apartment(number: 73)

// Aus dem Leitfaden "The Swift Programming Language" von Apple (https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html)

Dann, wenn das Apartment der Person zugewiesen wird, benutzen sie ein Ausrufezeichen, um die Instanz "auszupacken":

john!.apartment = number73

Was bedeutet es, eine Instanz "auszupacken"? Warum ist es notwendig? Wie unterscheidet es sich davon, einfach folgendes zu tun:

john.apartment = number73

Ich bin ganz neu in der Swift-Sprache. Versuche nur, die Grundlagen zu verstehen.

UPDATE:
Das große Puzzlestück, das mir fehlte (nicht direkt in den Antworten angegeben - zumindest nicht zum Zeitpunkt des Verfassens dieses Beitrags), ist, dass wenn man Folgendes tut:

var john: Person?

das NICHT bedeutet, dass "john vom Typ Person ist und vielleicht nil sein könnte", wie ich ursprünglich dachte. Ich habe einfach missverstanden, dass Person und Person? vollständig separate Typen sind. Sobald ich das verstanden hatte, ergaben alle anderen ?, ! Verwirrungen und die großartigen Antworten unten viel mehr Sinn.

2voto

Connor Punkte 62453

John ist eine optionale Person, was bedeutet, dass es einen Wert haben kann oder nil sein kann.

john.apartment = number73

wird verwendet, wenn john nicht optional ist. Da john nie nil ist, können wir sicher sein, dass nicht auf eine nil-Wert zugegriffen wird. Während

john!.apartment = number73

dem Compiler verspricht, dass john nicht nil ist, entpackt dann die Option, um den Wert von john zu erhalten und greift auf die Apartment-Eigenschaft von john zu. Verwenden Sie dies, wenn Sie wissen, dass john nicht nil ist. Wenn Sie dies bei einer nil-optionalen aufrufen, erhalten Sie einen Laufzeitfehler.

In der Dokumentation gibt es ein schönes Beispiel für die Verwendung davon, wobei convertedNumber optional ist.

if convertedNumber {
    println("\(possibleNumber) hat einen ganzzahligen Wert von \(convertedNumber!)")
} else {
    println("\(possibleNumber) konnte nicht in eine Ganzzahl konvertiert werden")
}

1voto

brimstone Punkte 3286

Um es einfach auszudrücken, bedeuten Ausrufezeichen, dass ein Optional ausgepackt wird. Ein Optional ist eine Variable, die einen Wert haben kann oder nicht - daher kannst du überprüfen, ob die Variable leer ist, indem du eine if let-Anweisung wie hier gezeigt verwendest, und es dann erzwingst auspacken. Wenn du jedoch ein leeres optionales erzwingst auszupacken, wird dein Programm abstürzen, also sei vorsichtig! Optionale werden deklariert, indem du ein Fragezeichen am Ende einer expliziten Zuweisung zu einer Variable setzt, zum Beispiel könnte ich schreiben:

var optionalBeispiel: String?

Diese Variable hat keinen Wert. Wenn ich es auspacken würde, würde das Programm abstürzen und Xcode würde dir sagen, dass du versucht hast, ein optionales mit einem Wert von nil auszupacken.

Hoffentlich hat das geholfen.

1voto

Maninderjit Singh Punkte 1289

MIT EINFACHEN WORTEN

VERWENDUNG Ein Ausrufezeichen gibt an, dass die Variable einen nicht-leeren Wert enthalten muss (sie darf niemals nil sein)

1voto

vishal dharankar Punkte 7369

Die gesamte Geschichte beginnt mit einem besonderen Merkmal von Swift namens optionaler Variablen. Dies sind Variablen, die einen Wert haben können oder auch nicht. Im Allgemeinen erlaubt uns Swift nicht, eine Variable zu verwenden, die nicht initialisiert wurde, da dies zu Abstürzen oder unerwarteten Problemen führen kann und auch eine Hintertür für Backdoors darstellt. Deshalb verwenden wir ein '?' um eine Variable zu deklarieren, deren Wert zunächst nicht festgelegt ist. Wenn eine solche Variable deklariert wird, muss man sie vor der Verwendung entschlüsseln, Entschlüsseln ist eine Operation, bei der der Wert einer Variablen entdeckt wird, dies gilt auch für Objekte. Ohne Entschlüsselung wird ein Kompilierungszeitfehler auftreten, wenn man versucht, sie zu verwenden. Um eine Variable zu entschlüsseln, die eine optionale Variable ist, wird das Ausrufezeichen "!" verwendet.

Es gibt jedoch Zeiten, in denen man weiß, dass solche optionale Variablen vom System oder vom eigenen Programm Werte zugewiesen bekommen, aber erst zu einem späteren Zeitpunkt, beispielsweise bei UI-Verbindungen. In solchen Situationen verwenden wir anstelle eines Fragezeichens "?" das "!".

Das System weiß also, dass diese Variable, die mit "!" deklariert ist, derzeit optional ist und keinen Wert hat, aber später im Lebenszyklus einen Wert erhalten wird.

Das Ausrufezeichen hat also zwei verschiedene Verwendungen: 1. Um eine Variable zu deklarieren, die optional ist und später definitiv einen Wert erhalten wird 2. Um eine optionale Variable zu entschlüsseln, bevor man sie in einem Ausdruck verwendet.

Die obigen Beschreibungen vermeiden zu viele technische Details, hoffe ich zumindest.

1voto

Andy Lebowitz Punkte 1471

Wenn Sie es optional verwenden, entpackt es das Optional und sieht, ob etwas vorhanden ist. Wenn Sie es in einer if-else-Anweisung verwenden, steht es für NICHT. Zum Beispiel,

if (myNumber != 3){
 // Wenn myNumber NICHT 3 ist, tun Sie das, was sich innerhalb dieser Klammern befindet.
)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X