2017-01-20 10 views
0

Я пишу PDF-парсер в Swift, и я достиг точки, где я получаю все данные шрифта с функцией обратного вызова (CGPDFDictionaryApplyFunction), функция getFont предполагается заполнять словарь шрифтов в классе PDFFontCollection. Внутри функции обратного вызова getFont переменная коллекции правильно заполнена - однако, когда обратный вызов завершен, в словаре шрифтов по-прежнему есть 0 записей.Словарь Swift не хочет заполняться из C Функция обратного вызова

class PDFFontCollection{ 
var fonts: [AnyHashable:Any]! 

init(page: CGPDFPage){ 
    fonts = [AnyHashable:Any]() 

    let fontsdict = self.findFontDictionary(page: page) 

    if(fontsdict != nil){ 
     CGPDFDictionaryApplyFunction(fontsdict!, self.getFont , &self.fonts) 
    } 
} 




private var getFont: CGPDFDictionaryApplierFunction = { (key, object, info) in 
    var collection = info?.assumingMemoryBound(to: [AnyHashable: Any].self).pointee 

    var name = String(cString: key, encoding: String.Encoding.ascii) 

    var dict: CGPDFDictionaryRef? 
    if (CGPDFObjectGetValue(object, .dictionary, &dict)){ 
     var font = PDFFont.pdfFont(withFontDictionary: dict!) 
     collection?.updateValue(font!, forKey: name!) 
    } 


} 
+0

Был на этом месте уже 3 часа ... Все еще не понял, что не так –

+0

Вы когда-нибудь слышали, что Swift 'Dictionary' является типом значений? – OOPer

+0

Да, но не указывается, что я передаю его по ссылке? –

ответ

0

Для тех, кто может быть заинтересован, PeejWeej является правильным. Вам необходимо объявить fonts как NSMutableDictionary, чтобы его можно было заполнить, так как [AnyHashable:Any] всегда передается по ссылке.