Aufruf von NSException.raise () in Swift

8

Ich versuche eine Ausnahme in Swift durch Aufruf von NSException.raise () auszulösen. Die Definition lautet:

%Vor%

Aber wenn ich etwas wie das folgende versuche:

%Vor%

Ich bekomme den Kompilierfehler: Extra Argument 'Format' im Aufruf.

Irgendwelche Ideen, was ich falsch mache? Ich benutze XCode 6 Beta 5.

    
Mark Horgan 07.08.2014, 14:47
quelle

3 Antworten

16

Das Problem scheint gewesen zu sein, dass ich den Fehler nicht als optional behandelt habe. Folgendes funktioniert:

%Vor%

Oder Sie könnten Folgendes tun, falls der Fehler null ist:

%Vor%     
Mark Horgan 07.08.2014, 15:22
quelle
13
%Vor%

Oder:

%Vor%

Oder:

%Vor%     
zaph 07.08.2014 15:31
quelle
2

Wie der Fragesteller herausgefunden hat, besteht das Problem darin, dass ein optionales Objekt nicht mit CVarArgType übereinstimmt und ein nicht-optionales Objekt dies tut, also müssen Sie etwas auspacken.

Wenn wir die Typen betrachten, die CVarArgType entsprechen, enthalten sie primitive numerische Typen, COpaquePointer , und NSObject hat eine Erweiterung, die NSObject dazu bringt, konform zu sein. Leider ist das eine direkte NSObject , nicht NSObject? , und nicht AnyObject? , wie wir es wünschen. Wenn Sie also ein NSObject? haben, können Sie es mit ! auspacken, aber wenn es nil ist, stürzt es ab. Oder wenn Sie ein Objekt haben, das kein Untertyp von NSObject ist, dann können Sie das auch nicht verwenden.

Aber in C / Objective-C konnten Sie einen beliebigen Zeigertyp als Vararg übergeben, einschließlich eines beliebigen Objektzeigers, und es funktionierte, egal ob es ein Nullzeiger war oder nicht. Wie replizieren wir dieses Verhalten in Swift?

Übrigens konnten sie AnyObject? (dh Optional<AnyObject> ) nicht mit CVarArgType übereinstimmen, weil Sie keine Methode (weder direkt in der Klasse noch in einer Erweiterung) für ein bestimmtes Argument von type definieren können ein generischer Typ (wie "Template-Spezialisierung" in C ++). Vielleicht wird Apple es in Zukunft hinzufügen. Aber im Moment muss eine Methode von Optional für alle Typargumente funktionieren. Aber wir wollen Nicht-Objekt-Optionen nicht als Var-Argumente übergeben, das funktioniert also nicht.

Wir können jedoch eine Funktion erstellen, die optionale Objekte in CVarArgType konvertiert. Wir können die Konformität von NSObject nutzen und den Fall behandeln, den es nicht behandelt - nil . nil ist nur ein Nullzeiger, und wir können stattdessen eine andere Art von Nullzeiger übergeben, einen COpaquePointer Nullzeiger, und er funktioniert, da alle Nullzeiger zur Laufzeit gleich sind:

%Vor%

Was ist mit Objekten, die nicht (oder wir wissen nicht) Subtypen von NSObject sind? Ich habe eine Version gemacht, die jedoch etwas übersichtlicher ist:

%Vor%     
newacct 08.08.2014 08:14
quelle

Tags und Links