gpt4 book ai didi

ios - NSClassFromString 为嵌套类返回 nil

转载 作者:搜寻专家 更新时间:2023-10-31 22:26:35 25 4
gpt4 key购买 nike

我想使用字符串来实例化一个类,但我遇到了问题。这就是我尝试做的:

let aClass = NSClassFromString("MyApp.Outer.Inner") as! SomeProtocol.Type
....
public class Outer {
public class Inner: SomeProtocol {
init() {...}
}
}

那会崩溃(因为 NSClassFromString 返回 nil

但这是有效的:

let aClass = NSClassFromString("MyApp.Inner") as! SomeProtocol.Type
....
public class Inner: SomeProtocol {
init() {...}
}

难道 NSClassFromString 不能用于嵌套类吗?


背景:我有许多“内部”类用作模板来创建对象(而不是将它们存储在 .plist 文件中,这有点烦人)。我想将它们封装在一个“外部”类中,以便更好地组织它们。

感谢您的帮助:)

编辑:我看到这个问题似乎是重复的。但这不是一个可行的解决方案:

(Note this snippet won't run by itself -- the class A.B has to be referenced at least once somewhere in your process in order to be registered with the ObjC runtime. This could be as simple as putting let t = A.B.self somewhere in your app's startup code.)

我正在使用 NSClassFromString 执行此方法,因为我想避免为我创建的每个内部类添加太多内容。我不想经常将它添加到我的启动代码中。

最佳答案

如果你运行这段代码:

import Foundation

class Outer: NSObject {
class Inner: NSObject {}
}

print(NSStringFromClass(Outer.Inner.self))

你会得到类似下面的东西:

_TtCC8Untitled5Outer5Inner

如您所见,嵌入式类的名称与您预期的不同。我相信 mangling 格式也没有记录,所以你不能指望它在未来的某个 Swift 版本中不会改变。

如果您需要能够在 Objective-C 运行时使用其名称访问类,您可以使用 @objc 属性为其指定一个自定义的 Objective-C 名称。不幸的是,@objc 关键字不允许使用点,但您可以使用下划线来达到类似的效果:

class Outer: NSObject {
@objc (Outer_Inner) class Inner: NSObject {}
}

编辑:我应该澄清一下,即使指定了 @objc 关键字,内部类仍然需要在 Swift 代码对 Objective-C 运行时可用之前进行访问,因此像 NSClassFromString() 这样的函数将起作用。

关于ios - NSClassFromString 为嵌套类返回 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45712055/

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