NSStringFromClass delivers fully qualified class names for class references like <ClassName>".self"
NSStringClassFromString delivers a class reference of kind AnyClass for fully qualified class names like <AppId>"."<ClassName">.
But it behaves different for subclasses of NSManagedObject.
Let's say the AppId is "MyApp".
class Foo: NSObject {}
@objc(Bar)
class Bar: NSManagedObject {}
print(NSStringFromClass(Foo.self)) // MyApp.Foo
print(NSStringFromClass(Bar.self)) // Bar
print(NSClassFromString("Foo")) // nil
print(NSClassFromString("Bar")) // MyApp.Bar
print(NSClassFromString("MyApp.Foo")) // MyApp.Foo
print(NSClassFromString("MyApp.Bar")) // nil
That can lead to problems, when creating the input for NSClassFromString dynamically, e.g. by concatenating the 'AppId' with the class name determined by MyClass.self. It seems that subclasses of NSManagedObject don't belong to the Apps namespace.
It's interesting. The functions are reversive.
let fco = NSClassFromString(NSStringFromClass(Foo.self))
let fct = NSClassFromString(NSStringFromClass(fco!))
// fco == fct
let bco = NSClassFromString(NSStringFromClass(Bar.self))
let bct = NSClassFromString(NSStringFromClass(bco!))
// bco == bct
But the intermediate results differ, as you can see in the upper listing.
Serious question: Is this a bug or a feature? If it's a feature, what are the reasons and advantages.
Aucun commentaire:
Enregistrer un commentaire