W ObjC można po prostu wywołać metodę klasy, używając metody klasy od NSObject
.Jak wywołać metodę klasy za pomocą performSelector() na AnyClass w Swift?
[Machine performSelector:@selector(calculate:) withObject:num];
Ale jak to zrobić w Swift 2.2?
@objc(Machine) // put it here, so you can simply copy/paste into Playground
class Machine: NSObject {
static func calculate(param: NSNumber) -> String {
if param.integerValue > 5 {
return "42"
}
return "42" // there is only 1 answer to all the questions :D
}
}
if let aClass = NSClassFromString("Machine") {
let sel = #selector(Machine.calculate(_:))
let num = NSNumber(integer: 1337)
let answer = aClass.performSelector(sel, withObject: num) // compiler error
// let answer = aClass.calculate(num) // <-- this works
print(answer)
}
Z tym kodem Ja otrzymuję następujący błąd kompilatora:
error: cannot invoke 'performSelector' with an argument list of type '(Selector, withObject: NSNumber)'
Co ja tu brakuje?
Z pewnością nie jest bezcelowe, a co jeśli chcesz używać klasy z zewnętrznego źródła? NA PRZYKŁAD. czytając nazwę klasy z łańcucha w pliku plist, czy napiszesz warunek if na podstawie każdego możliwego obiektu? – Knight0fDragon
Powiązane: [Dostęp do prywatnej funkcji UIKit bez użycia nagłówka pomostowego] (http://stackoverflow.com/q/35183818/2415822) – JAL