Ursprüngliche Frage (siehe folgende Lösung):
Ich versuche, das AddressBook.framework in meiner Swift App zu verwenden, kann aber nicht herausfinden, wie die Funktion ABAddressBookRegisterExternalChangeCallback
implementiert wird.
In Objective-C implementiere ich den Callback einfach als C-Funktion und gebe den Zeiger:
%Vor%In Swift ist es sehr schwierig für mich, mit C-Funktionen umzugehen. Ich habe festgestellt, dass Apple die Fähigkeit hinzugefügt hat, C-Funktionszeiger in der Beta 3 zu übergeben, aber wie deklariere ich eine solche Funktion? Es wäre gut, Swifts Verschlusssyntax zu verwenden, aber ist das hier überhaupt möglich?
Hier erstelle ich ABAddressBookRef
:
Wie kann ich das in Swift umsetzen?
Lösung (mit Fehlern):
Wie von pNre vorgeschlagen, habe ich es jetzt implementiert:
In Ziel-C:
AddressBookExternalChangeCallback.h:
%Vor%AddressBookExternalChangeCallback.m:
%Vor%In Swift:
nach dem Import des Bridging-Headers:
%Vor% Wenn das Adressbuch geändert wird, wird eine Benachrichtigung gesendet. Nur @objc
-Klassen können sich jedoch für Benachrichtigungen registrieren. Gibt es also eine Möglichkeit, stattdessen eine Swift-Funktion oder -Methode aufzurufen?
ABExternalChangeCallback
ist definiert als
Aus den Xcode-Versionshinweisen:
Sie können jedoch keinen C-Funktionszeiger (
CFunctionPointer
) oder aufrufen wandle eine Schließung in den C-Funktions-Zeigertyp um.
Dies bedeutet, dass Sie einen Block nicht so zuweisen können, wie Sie es tun.
Sie können diese Einschränkung jedoch umgehen, indem Sie ABAddressBookRegisterExternalChangeCallback
in einer objc-Funktion aufrufen und sie über Ihren Swift-Code aufrufen.
Ich habe das gleiche Problem. Aber ich habe den Cache gelöscht, indem ich ABAddressBookRevert () im Adressbuchobjekt aufgerufen habe.
Tags und Links swift abaddressbook