/ / Използване на препратка към CFPropertyListRef в Swift - object-c, swift, указатели, референция, ядро-основа

Използване на позоваване на CFPropertyListRef в Swift - цел-c, бързи, указатели, справка, core-foundation

Аз понастоящем конвертирам някакъв код на Objective-C в бърз и аз се задържам. Имам вътрешен API, който изпълва CFPropertyList и връща неговия формат.

MyFunction(CFPropertyListRef list, CFPropertyListFormat *fmt);

В Objective-C аз го наричам чрез

CFDictionaryRef myList;
CFPropertyListFormat fmt;
MyFunction(&myList, &fmt)

Чрез "Generated Interface" мога да видя, че swift се превръща в

MyFunction(_ list: CFPropertyList!, _ fmt: UnsafeMutablePointer<CFPropertyListFormat>))

Когато се опитвам да извикам функцията в swift via

var fmt = CFPropertyListFormat.XMLFormat_v1_0
var plist = NSDictionary() as CFPropertyListRef
MyFunction(plist, &fmt)

Получавам EXC_BAD_ACCESS. Тъй като компилаторът не се оплаква от типовете, мисля, че това трябва да е правилно. Всяка помощ е много ценена! Благодаря

Отговори:

1 за отговор № 1

Ако вашата употреба в Objective-C е наистина права, функцията заглавието на вашия MyFunction трябва да е нещо подобно:

extern void MyFunction(CFPropertyListRef *list, CFPropertyListFormat *fmt);

(CFPropertyListRef всъщност е просто тип void * в Цел-C / C. Така че компилаторът рядко извежда предупреждения за много възможни неправилни употреби.

И Swift 2 внася такава функция като:

public func MyFunction(list: UnsafeMutablePointer<Unmanaged<CFPropertyList>?>, _ fmt: UnsafeMutablePointer<CFPropertyListFormat>)

Така че, ако приемем, че сте променили заглавката на функцията, както по-горе, трябва да го използвате, както следва:

var fmt: CFPropertyListFormat = .XMLFormat_v1_0
var umPlist: Unmanaged<CFPropertyList>? = nil
MyFunction(&umPlist, &fmt)
var plist = umPlist?.takeRetainedValue() //or this may be `umPlist?.takeUnretainedValue()`