Obecnie konwertuję kod Objective-C na Swift i utknąłem. Mam wewnętrzny interfejs API, który wypełnia CFPropertyList i zwraca jej format.
MyFunction(CFPropertyListRef list, CFPropertyListFormat *fmt);
W Objective-C dzwonię przez
CFDictionaryRef myList;
CFPropertyListFormat fmt;
MyFunction(&myList, &fmt)
Dzięki „wygenerowanemu interfejsowi” widzę, że szybko przekonwertowano na
MyFunction(_ list: CFPropertyList!, _ fmt: UnsafeMutablePointer<CFPropertyListFormat>))
Kiedy próbuję wywołać funkcję w szybkim przez
var fmt = CFPropertyListFormat.XMLFormat_v1_0
var plist = NSDictionary() as CFPropertyListRef
MyFunction(plist, &fmt)
Otrzymuję EXC_BAD_ACCESS. Ponieważ kompilator nie narzeka na typy, myślę, że powinno to być poprawne. Każda pomoc jest bardzo ceniona! Dzięki
Odpowiedzi:
1 dla odpowiedzi № 1Jeśli użycie w Objective-C jest naprawdę prawidłowe, nagłówek funkcji pliku MyFunction
musi być coś takiego:
extern void MyFunction(CFPropertyListRef *list, CFPropertyListFormat *fmt);
(CFPropertyListRef
w rzeczywistości jest tylko aliasem typu void *
w celu-C / C. Tak więc kompilator rzadko wyświetla ostrzeżenia o wielu możliwych błędach użycia typów).
A Swift 2 importuje takie funkcje, jak:
public func MyFunction(list: UnsafeMutablePointer<Unmanaged<CFPropertyList>?>, _ fmt: UnsafeMutablePointer<CFPropertyListFormat>)
Zakładając, że zmieniłeś nagłówek funkcji jak powyżej, musisz go użyć w następujący sposób:
var fmt: CFPropertyListFormat = .XMLFormat_v1_0
var umPlist: Unmanaged<CFPropertyList>? = nil
MyFunction(&umPlist, &fmt)
var plist = umPlist?.takeRetainedValue() //or this may be `umPlist?.takeUnretainedValue()`