Swift:NSClassFromString和NSStringFromClass对NSManagedObjects的行为不同

时间:2015-12-23 12:46:04

标签: swift core-data reflection

NSStringFromClass为类引用提供完全限定的类名,例如<ClassName>".self"

NSStringClassFromString为类AnyClass等完全限定的类名提供类<AppId>"."<ClassName">的类引用。

但它对NSManagedObject的子类的行为有所不同。

让我们说AppId是&#34; MyApp&#34;。

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

在动态创建NSClassFromString输入时,这会导致问题,例如通过连接AppId&#39;类名由MyClass.self确定。似乎NSManagedObject的子类不属于Apps命名空间。

很有意思。这些功能是可逆的。

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

但是中间结果不同,正如您可以在上面的列表中看到的那样。

严肃的问题:这是一个错误还是一个功能?如果它是一个功能,原因和优势是什么。

1 个答案:

答案 0 :(得分:0)

我从我的游乐场得到了什么,它与你的结果不同......

pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created
vgcreate vgluks /dev/sdb
Volume group "vgluks" successfully created

lvcreate -l 90%FREE -n lvdocker-data vgluks
WARNING: crypto_LUKS signature detected on /dev/vgluks/lvdocker-data at offset 0. Wipe it? [y/n]: y
Wiping crypto_LUKS signature on /dev/vgluks/lvdocker-data.
Logical volume "lvdocker-data" created.

lvcreate -l 100%FREE -n lvdocker-metadata vgluks
Logical volume "lvdocker-metadata" created.