Аз понастоящем конвертирам някакъв код на 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()`