Этот вопрос старый, поэтому я не знаю, разобрались ли вы к этому моменту, но вы еще не ответили на него, и я некоторое время возился с передачей параметров из Obj-C в Python.Есть несколько вещей, которые вы обязательно должны попробовать / изучить:
Первое и самое простое: когда вы делаете эту заглушку в Objective-C с реализацией на Python, вы должны указать, что (NSError **)
это out
параметр:
@interface MyObject : NSObject
- (BOOL)testMethod:(out NSError **)error;
@end
Я успешно использовал это для вызова пользовательского метода Obj-C из Python.Я полагаю, что сторона Python не может получить правильные метаданные в противном случае.
Там также добавлен декоратор signature
к определению вашего метода Python.Вы можете указать, что один из параметров является параметром out в sig.Этот PyObjC doc содержит подробности.
@objc.signature('@@:io^@')
Другое дело (и вы, возможно, уже поняли это самостоятельно), что если вы не хотите выполнять Цель-C заглушка, вы можете создавать свои собственные метаданные и вставлять файл .bridgesupport в свой проект.Единственная вещь (большая вещь!), В которой я не уверен, это как убедиться, что этот файл действительно прочитан.Сами метаданные действительно легко записывать - Apple предоставляет утилиту командной строки под названием gen_bridge_metadata, и вы можете сделать это вручную (смотрите /System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC/AppKit/PyObjC.bridgesupport).Для этой утилиты есть справочная страница , а man 5 BridgeSupport
также информативен.Еще один документ Apple, который вы должны прочитать: Создание метаданных платформы .
ОБНОВЛЕНИЕ для будущих читателей: я нашел функции objc.registerMetaDataForSelector
и objc.parseBridgeSupport
, обаиз которых вы можете добавить метаданные для ваших методов, используя либо Python dicts (первая функция), либо формат XML, описанный на справочной странице BridgeSupport (последняя).Примеры использования registerMetaData...
доступны в источнике pyobjc по адресу: pyobjc / pyobjc-core / PyObjCTest / test_metadata *, который я обнаружил в этом списке рассылки pyobjc-dev thread .