"Downcasting" C Strukturen in Swift

8

Core MIDI ist eine C-API, die Fähigkeiten bietet, die anderswo nicht zu finden sind.

Wenn sich das MIDI-Setup des Benutzers ändert (z. B. wenn Sie ein Gerät eingesteckt haben), wird eine Benachrichtigung angezeigt.

Dies ist der Typ der aufgerufenen Funktion.

%Vor%

Der erste Parameter ist eine MIDINotification-Struktur, die wie folgt aussieht:

%Vor%

Sie können den Rückruf wie folgt implementieren:

%Vor%

Sie würden sich das Mitglied von messageID ansehen, um zu sehen, welche Art von Benachrichtigung Sie gerade erhalten haben. Es gibt mehrere (ich zeige nur einen). Für jede Art von Benachrichtigung erhalten Sie eine andere Struktur, die übergeben wird. Dies ist die Struktur, die Sie erhalten, wenn ein Gerät hinzugefügt oder entfernt wurde:

%Vor%

Wie Sie sehen, hat diese Struktur zusätzliche Informationen. Das "Kind" könnte beispielsweise ein Endpunkt für ein Gerät sein, daher benötigen Sie diese Felder.

Das Problem besteht darin, von der MIDINotification-Struktur (die von der Callback-Signatur benötigt wird) in MIDIObjectAddRemoveNotification umzuschalten. Die Zeile, die ich mit "as" gezeigt habe, funktioniert nicht.

Haben Sie irgendwelche Vorschläge für diese Art von "downcasting"?

    
Gene De Lisa 29.12.2014, 13:48
quelle

3 Antworten

2

Als Vatsal Manot vorgeschlagen , da MIDINotification und MIDIObjectAddRemoveNotification nicht durch eine Vererbung oder einen Vertrag verbunden sind, Swift kann kein sicheres Casting zwischen diesen Strukturen durchführen.

Sie müssen es explizit mit unsafeBitCast function:

umsetzen %Vor%

Beachten Sie, dass diese Funktion in Swift immer zum Ausführen von Umwandlungen verwendet werden kann, aber es ist extrem unsicher und Sie sollten es nur als letzte mögliche Lösung verwenden.

    
akashivskyy 29.12.2014 14:16
quelle
2

Ich schlage vor, dass Sie sich die Standardbibliotheksfunktion unsafeBitCast ansehen.

    
Vatsal Manot 29.12.2014 13:52
quelle
1

Sie vergessen eine Sache. Selbst bei Obj-C passiert das Casting immer auf Zeigern. Sie können Speicher nicht in den Speicher werfen (gut, manchmal können Sie es neu interpretieren, aber es ist nicht sehr sicher).

%Vor%     
Sulthan 28.07.2015 10:51
quelle

Tags und Links