gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:49:46 28 4
gpt4 key购买 nike

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

NSStringClassFromString提供类的类引用 AnyClass对于完全限定的类名,如 <AppId>"."<ClassName">

但是对于 NSManagedObject 的子类它的行为有所不同.

假设 AppId 是“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

在为 NSClassFromString 创建输入时,这可能会导致问题动态地,例如通过将“AppId”与 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

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

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

最佳答案

我从 Playground 得到的结果与你的结果不同......

import CoreData

class Foo: NSObject {
required override init() {
super.init()
}
let test = 100
}

@objc(Bar)
class Bar: NSManagedObject {
required convenience init() {
self.init(entity: NSEntityDescription(), insertIntoManagedObjectContext: nil)
}
}

let s1 = NSStringFromClass(Foo.self) // "__lldb_expr_xxx.Foo"
let s2 = NSStringFromClass(Bar.self) // "Bar"

let cFooType = NSClassFromString(s1) as! Foo.Type
let c = cFooType.init()
c.test == 100 // true

// to create Bar, you have to implement a little bit more, but the
// strategy could be the same

// the init for class Bar is there just to compile, you need real values for entity an insertIntoManagedObjectContext ....

关于Swift:NSClassFromString 和 NSStringFromClass 对于 NSManagedObjects 的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34436035/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com