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.
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% 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:
Was ist mit Objekten, die nicht (oder wir wissen nicht) Subtypen von NSObject
sind? Ich habe eine Version gemacht, die jedoch etwas übersichtlicher ist:
Tags und Links swift