/ / Korzystanie z odniesienia do CFPropertyListRef w języku Swift - objective-c, swift, wskaźniki, odniesienie, rdzeń-fundament

Używanie odniesienia do CFPropertyListRef w Swift - cel-c, szybkie, wskaźniki, referencje, podstawowe podstawy

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 № 1

Jeś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()`