Из Apple
func perform(_ aSelector: Selector!, with object: Any!) -> Unmanaged<AnyObject>!
do c https://developer.apple.com/documentation/objectivec/nsobjectprotocol/1418764-perform
Отправляет получателю сообщение с объектом в качестве аргумента.
Ваш аргумент SEL
sel не является объектом . Внутренне это на самом деле char*
указатель. Таким образом, вы не можете использовать
TestSelector.perform(#selector(TestSelector.test(_:)), with: sel)
таким образом.
Если вы хотите продолжать использовать perform(_:with:)
, вам придется внести некоторые изменения в ваш код. Пример обходного пути может выглядеть следующим образом:
В части Objective- C *
@implementation TestSelector
+ (void)test:(NSString*)selectorName {
NSLog(@"%@", selectorName);
}
@end
и в части Swift:
let sel = #selector(UICollectionViewDelegateFlowLayout.collectionView(_:layout:insetForSectionAt:))
TestSelector.perform(#selector(TestSelector.test(_:)), with: NSStringFromSelector(sel))
Однако Если вы хотите сохранить свой исходный код Objective- C с SEL
, вы можете вызвать селектор в Swift с помощью @convention(c)
. Я подробно рассказал об этом в своем ответе здесь
Для вашего конкретного случая вызов Swift будет выглядеть так:
let selArg = #selector(UICollectionViewDelegateFlowLayout.collectionView(_:layout:insetForSectionAt:))
let selector = #selector(TestSelector.test(_:))
let methodIMP: IMP! = method_getImplementation(class_getClassMethod(TestSelector.self, selector))
unsafeBitCast(methodIMP,to:(@convention(c)(AnyClass?,Selector,Selector)->Void).self)(TestSelector.self,selector, selArg)