In ObjC können Sie einfach eine Klassenmethode mit der Klassenmethode von NSObject
aufrufen.Wie ruft man eine Klassenmethode mit performSelector() auf AnyClass in Swift auf?
[Machine performSelector:@selector(calculate:) withObject:num];
Aber wie machst du das in 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)
}
Mit diesem Code, den ich die folgende Compiler-Fehler bekommen:
error: cannot invoke 'performSelector' with an argument list of type '(Selector, withObject: NSNumber)'
Was soll ich hier fehlt?
Es ist definitiv nicht sinnlos, was ist, wenn Sie die Klasse von einer externen Quelle verwenden möchten? Z.B. Lesen Sie den Klassennamen aus einer Zeichenkette in einem Plist, werden Sie eine if-Bedingung basierend auf jedem möglichen Objekt schreiben? – Knight0fDragon
Related: [Zugriff auf private UIKit-Funktion ohne Verwendung von Bridging-Header] (http://stackoverflow.com/q/35183818/2415822) – JAL