У меня проблема, когда быстрый класс проверяется некоторым кодом Objective-c, я могу получить исходный метод для класса, но всякий раз, когда я устанавливаю элемент, он приводит к метод удаляется из класса.class_replaceMethod в Objective-c не работает над классом Swift
Я предполагаю, что мой IMP не соответствует спецификациям, необходимым для быстрого класса, но я не нашел много способов помочь в Интернете.
Моего простой пример выглядит следующим образом:
+(void)injectPropertyTrapsFor:(NSString*)propName reader:(IMP)r writer:(IMP)w typeEncoding:(const char*)type {
IMP oldMethod = class_replaceMethod([self class], NSSelectorFromString(propName), r, [[NSString stringWithFormat:@"%[email protected]:", type] UTF8String]);
IMP replacedMethod = class_getClassMethod([self class], NSSelectorFromString(propName));
}
oldMethod не ноль и содержит (в моем случае) класс геттер быстрого для свойства. Но как только я заменил его, последующий вызов для получения метода снова возвращает nil.
Я пропустил методы, используя приведенный ниже код, и он возвращает довольно нормальные свойства propertyName и setPropertyName: как и следовало ожидать.
int unsigned numMethods;
Method *methods = class_copyMethodList([self class], &numMethods);
for (int i = 0; i < numMethods; i++) {
NSLog(@"%@", NSStringFromSelector(method_getName(methods[i])));
}
free(methods);
Выход, который производит следующее:
initWithPrimaryKeyValue:
forename
setForename:
surname
setSurname:
favoriteColour
setFavoriteColour:
.cxx_destruct
init
Когда я печатаю описание на существующих методах, которые они выглядят следующим образом.
Printing description of oldMethod:
(IMP) oldMethod = 0x000000010d72f440 (DBAccess Test`@objc DBAccess_Test.ViewController.Person.surname.getter : Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSString> at ViewController.swift)
Я не уверен, чего я хочу достичь, даже возможно, но было бы неплохо найти какое-то решение.
TLDR Версия: Как перехватить get/set свойств из Objective-c в классе быстрого доступа, к которому у меня нет знаний или доступа к коду?
Edit:
Для справки это стремительная класс:
class Person: DBObject {
var forename:NSString!
var surname:NSString!
var age:Int!
var favoriteColour:NSString!
}
Благодаря
Предполагая, что ваш код работает с классами Objective C, добавление динамического ключевого слова должно исправить обмен: 'dynamic var forename: ...' –
Спасибо @BrianNickel, к сожалению, та же проблема существует. замена не работает. Я могу подтвердить, что этот код отлично работает с классом obj-c, но не с быстрым (он наследуется от класса Obj-c). –
Хорошо, глядя на это, у меня есть нулевые доказательства, но это похоже на то, что я играю с реализацией методов класса, но свойства - это методы экземпляра, и он просто «всегда» работал раньше в obj-c. Больше от немой удачи, чем приличного кодирования. –