- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想使用字符串来实例化一个类,但我遇到了问题。这就是我尝试做的:
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/
我想创建一个依赖于给定模型实例的类的 Controller -(BaseController *)getControllerForModel:(Model *)model { Ba
这是我遇到的这个代码案例的问题: let entityTypeDico = ["entityTypeOne": arrayOne, "entityTypeOneTwo": arrayTwo,
使用 NSClassFromString 会有任何性能优势吗?特别是与从 header 导入类并初始化的标准方法相比时。 最佳答案 完全没有。如果有的话,NSClassFromString 比使用类的
我有一个类 X 和几个类 X1,X2,X3,X4 是 X 的后代 我有一个带有类名的 NSArray,我用它来迭代: _classnames = @[@"X1",@"X2",@"X3",@"X4"];
我正在尝试在 MonoTouch 中使用诸如以下 Objective-C 的代码: if (NSClassFromString(@"ADBannerView")) C# 中的等价物是什么? 基本上我想
NSClassFromString 在使用可选项时不起作用: var t = NSClassFromString("Swift.Optional") 有人能帮忙吗? 最佳答案 你是对的! NSClas
我目前正在尝试从 NSClassFromString(NSString *) 方法创建对象。 我希望能够实现的是以下... NSClassFromString(stringType) *pageCon
我正在尝试创建一个工厂类结构,其中我的抽象基类 PDObject 根据 NSDictionary 中传递给它的信息实例化一个正确的子类实例。这是我的 PDObject 初始化方法: - (id)i
我正在尝试编写一个函数,从我的字符串数组中加载一个特定的 View Controller >。然而,我很快就在这个概念上苦苦挣扎——我在 Objective - C 中实现了这一点。 static N
在下面的代码中,我使用 NSClassFromString 将 NSString“ColorFilter”转换为类名 ColorFilter。结果 ColorFilter 类似乎没有与同名导入语句中我
如果我在B.h文件中这样写: @interface A : NSObject @end @interface B : NSObject @end 然后 NSClassFromString(@"A")
我尝试动态调用某些 viewController/Feature 取决于他的名字。NSClassFromString (这种想法是由 Facebook 提出的)。对于来 self 的服务器的实例,我可
我有这个示例代码: let structType: String = "elearning_lesson" if let classType = NSClassFromString(struc
尽管 ListCell 是一个有效类,但以下代码打印出 nil。 var lCellClass : AnyClass! = NSClassFromString("ListCell"); println
我尝试使用从 NSClassFromString 创建的类来执行类方法,但我失败了。 在 Objective-C 中,这很容易: - (id)initWithStyle:(UITableViewCel
我的项目中有一个测试类,它在开发阶段就存在,但会为应用商店构建编译出来。 我在几本书中读到 NSClassFromString 可用于确定类是否存在,示例代码如下: if (NSClassFromSt
我想使用字符串来实例化一个类,但我遇到了问题。这就是我尝试做的: let aClass = NSClassFromString("MyApp.Outer.Inner") as! SomeProtoco
我进行动态类加载的原因是因为我正在创建一组可以在多个类似项目中使用的文件,所以执行#import 然后再进行正常实例化是行不通的。动态类允许我这样做,只要我可以在这些类中调用方法。每个项目在 pch
我目前正在装有 iOS 4.0 的 iPhone 3G 上测试一个应用程序。 我有以下代码来检查这个类是否可用。 if (NSClassFromString(@"CLGeocoder")) 在文档中它
尽管 ListCell 是一个有效类,但以下代码打印出 nil。 var lCellClass : AnyClass! = NSClassFromString("ListCell"); println
我是一名优秀的程序员,十分优秀!