在 swift 中使用 NSClassFromString 实例化嵌套类

2024-03-03

我有一个如下定义的嵌套类:

@objc class A { 
    @objc class B{

    } 
}

我需要实例化A.B using NSClassFromString。我能够在简单的课程中做到这一点A但是当我附加到NSClassFromString参数.Bstring 它只返回 nil。

NSClassFromString("\(appName).A") // works... 
NSClassFromString("\(appName).A.B") //doesn't work.

我想由于 Objective-c 中没有嵌套类NSClassFromString只是不适用于嵌套类...在这种情况下,还有另一种方法可以从字符串初始化嵌套类吗?

// EDIT

很好奇反函数如何NSStringFromClass对标准类和嵌套类执行时返回不同的格式:

"myApp.A" <---- STANDARD CLASS (A)
"_TtCC15myApp13A6B" <----- NESTED CLASS (A.B) 

正如您所看到的,格式完全不同。那是什么_TtCC15?为什么 ”。”已被删除?我想以这种格式传递类NSClassFromString应该管用。


我发现以下内容在游乐场(Xcode 8.2 / Swift 3)中有效:

// inheriting NSObject is required for `@objc`, at which point `@objc` is optional
class A: NSObject {
    class B: NSObject {
        override var description: String { return "foo" }
    }
}

let str = NSStringFromClass(A.B.self)
guard let anyClass = NSClassFromString(str)
    else { fatalError("no class") }
// cast to a type that defines `init()` so we can instantiate
guard let nsClass = anyClass as? NSObject.Type 
    else { fatalError("class isn't NSObject") }
// call `.init()`, not `nsClass()`; constructor syntax is for static types only
let instance = nsClass.init() 
print(instance) // -> "foo"

奇怪的类“名称”字符串是因为 ObjC 运行时不理解嵌套类(或 Swift 可以定义但 ObjC 不能定义的其他类型)——在 Swift 本身内,这种损坏的名称是类型、函数等的方式得到唯一定义。 (例如,名称修饰也是函数重载的工作原理:func foo() and func foo(num: Int) -> Bool内部有不同的损坏名称。)

桥接机制仍然可以动态解析给定正确修改的 Swift 名称的类,但 Swift 名称修改是一个实现细节,可能会发生变化。 (至少在 Swift 4 锁定 ABI 之前。)因此传递结果是安全的NSStringFromClass to NSClassFromString在同一个程序中,但不安全(例如)在测试中记录一次损坏的名称,将该损坏的名称作为字符串文字或资源发送到您的应用程序中,并期望它能够与NSClassFromString later.

相反,如果您希望嵌套类(或任何其他 Swift 定义的类)有一个可靠的已知名称以便在 ObjC 运行时使用,请给它一个@objc(name)(如中所述the docs https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html#//apple_ref/doc/uid/TP40014216-CH4-ID55):

@objc class A: NSObject {
    @objc(A_B) class B: NSObject { /*...*/ }
}
guard let anyClass = NSClassFromString("A_B")
    else { fatalError("no class") }

(请注意,此代码片段不会自行运行 - 该类A.B必须在进程中的某处至少引用一次才能在 ObjC 运行时注册。这可能就像把let t = A.B.self应用程序启动代码中的某个位置。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 swift 中使用 NSClassFromString 实例化嵌套类 的相关文章

  • UITableView 快速获取 titleForHeadersInSection

    我想在 UITableView 的部分中设置标题的标题 语法是什么swift设置该部分中标题的标题 func tableView tableView UITableView titleForHeaderInSection section I
  • 如何右对齐 UILabel?

    Remark 实施 myLabel textAlignment right does not解决了我的问题 这不是我所要求的 我想要实现的是让标签对齐右对齐 为了更清楚地说明 这就是如何left对齐外观 就是这样justify对齐外观 if
  • 调用 SwiftUI 中位置 #11、#12 处的额外参数 [重复]

    这个问题在这里已经有答案了 我在 SwiftUI 中的切换开关上不断收到 调用中位置 11 12 处有额外参数 错误 我见过其他人有 调用中的额外参数 错误 但答案似乎没有帮助 另外 我的错误是 位置 11 12 我还没有看到其他人发生这种
  • Swift 中的柯里函数

    我想创建一个返回柯里函数的函数 如下所示 func addTwoNumbers a Int b Int gt Int return a b addTwoNumbers 4 b 6 Result 10 var add4 addTwoNumbe
  • Xcode 10 Beta 5 — clang:错误:链接器命令失败,退出代码为 1

    有人可以帮我吗 我的项目一切正常 但更新到 Xcode10 Beta5 后 尝试在 iPhone 上运行该应用程序时出现此错误 然而模拟器可以工作 请帮助我 我已经对这个问题进行了网络搜索并发现this https stackoverflo
  • iOS 防止计时器 UILabel 在数字变化时“晃动”

    我有一个UILabel它以以下格式显示计时器的输出MM ss SS 分 秒 厘秒 但是随着厘秒宽度的变化 它从左向右 摇动 例如 11 比 33 窄 有什么办法可以减轻这种情况吗 我尝试过将其居中 给它固定的宽度 但它们似乎没有帮助 从iO
  • AWS S3 公共对象与私有对象?

    回到 S3 我的存储桶中有图像的 URL 我将在我的应用程序中呈现这些图像 但它们被设置为私有 当我尝试单击该链接时 它显示 访问被拒绝 当我将链接的设置更改为公共时 它会通过 但是我读到公共访问并不是最安全的事情 所以这本质上是一个由两部
  • 检测 AVAudioPlayer 中的播放结束

    我有几个短的 mp3 声音 我将它们存储在数组中 并希望连续播放它们 有什么方法可以检测 AVAudioPlayer 何时停止播放 以便我可以调用完成处理程序并播放下一个声音 我知道有一个委托 但我正在使用 Playground 和 SKS
  • 当 UITextField 已满或空时显示警报 Swift

    下面的代码中 如果 userNameTF 或 passwordTF 已满或为空 则会显示警报 IBAction func LoginBtn sender AnyObject let userName userNameTF text let
  • NVActivityIndi​​catorView 仅适用于特定视图

    我正在使用这个库https github com ninjaprox NVActivityIndi catorView https github com ninjaprox NVActivityIndicatorView用于显示加载指示器
  • 为什么我的视图仍然以横向呈现?

    我的视图是由导航控制器控制的 因此我将导航控制器支持的方向设置为明确的纵向和纵向UpSideDown 这可以工作 但是如果调用视图时前一个视图处于横向状态 它将以横向方式呈现并保持横向状态 直到设备旋转 如何防止这种情况发生 这是我的代码
  • SKNode 上的 runAction 未完成

    我使用 NSOperation 子类来获取串行执行SKAction正如这个问题中所描述的 如何在 Swift 中子类化 NSOperation 以将 SKAction 对象排队以进行串行执行 https stackoverflow com
  • Swift C 回调 - Swift 类指针的 takeUnretainedValue 或 takeRetainedValue

    我有一些UIView or UITableViewCell 里面我有 C 回调 例如 CCallback bridge self observer data gt Void in let mySelf Unmanaged
  • IPV6 快速可达性

    我是 swift 和 xcode 的新手 并且我的应用程序因 IPV6 而被拒绝 性能 2 1 当我们执行以下操作时 您的应用程序会在运行 iOS 9 3 5 并连接到 IPv6 网络的 iPad 和 iPhone 上崩溃 具体来说 当我们
  • 使用 UISearchBar 过滤数组

    我目前正在使用以下代码来过滤数组并将结果显示在我的 tableView 中 问题是 只有当搜索与确切的单词匹配时 才会返回结果 如何更改数组过滤器以在输入时搜索每个字符 let data Mango Grape Berry Orange A
  • 如何防止 RealmSwift 列表中出现重复项?

    如何防止向列表中添加重复项RealmSwift 我有我的User作为领域对象 但真正的数据源是服务器 只是使用领域在本地缓存用户 当我从服务器获取当前用户数据时 我想确保存储在领域中的用户拥有来自服务器的所有播放列表 以及它们的曲目列表等
  • Swift 3 错误:[_SwiftValue pointSize] 无法识别的选择器发送到实例

    我刚刚将我们的项目迁移到 swift 3 发现由于一个问题导致大量崩溃 由于未捕获的异常 NSInvalidArgumentException 而终止应用程序 原因 SwiftValue pointSize 发送到实例的无法识别的选择器 该
  • Transit MKDirectionsRequest 产生 null 错误 Error Domain=MKErrorDomain Code=5 "(null)"

    我正在尝试使用 MapKit Directions Request 来获取两个坐标之间的交通方向 当我切换到其他 非 Transit 类型时 下面的代码可以工作 但是当我切换到 Transit 时 它会抛出一个错误 该错误在 Apple 文
  • iOS UIButton 带有圆角和背景 bug

    我发现圆形 UIButton 存在一个奇怪的问题 这是我创建此按钮的代码块 let roundedButton UIButton type System roundedButton frame CGRectMake 100 100 100
  • Swift getnameinfo IPv6 结果不可靠

    我有以下扩展sockaddr extension sockaddr Indicates if this is an IPv4 address var isIPv4 Bool return sa family UInt8 AF INET In

随机推荐

  • 如何使用 isalnum、isdigit、isupper 来测试字符串的每个字符? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试制作一个密码强度模拟器 它要求用户输入密码 然后返回分数 我在用 islanum isdigit isupper 尝试看看输入的
  • 在 C 中编译/匹配 POSIX 正则表达式

    我正在尝试匹配字符串中的以下项目pcode u后跟 1 或 2 位数字 phaseu phasep x 被非单词字符包围 y 被非单词字符包围 z 被非单词字符包围 我尝试使用 POSIX 正则表达式函数 如下所示 实现正则表达式匹配 但有
  • GoogleHadoopFileSystem 无法转换为 hadoop FileSystem?

    原来的问题是尝试在 Google Cloud 上部署 Spark 1 4 https stackoverflow com questions 31466206 spark 1 4 image for google cloud 下载并设置后
  • WCF 最佳性能设置

    您好 我正在使用 WCF 创建一个 API 我的问题可以分为两个单独的问题 1 我有很多电话 例如我有与客户 产品 订单 员工有关的电话 我的问题是所有这些都应该进入一个公共接口类 例如 public interface IRestServ
  • Mac 终端重新启动后无法运行大多数命令

    我正在使用Mac 我有一个定制终端zsh 有一段时间就好了 但在我重新启动计算机后 它的行为开始有所不同 终端停止运行命令 例如rake or rails 我已经使用rails创建了应用程序 但是使用了类似的rails命令rails v现在
  • 前面的字长

    我必须创建一个带有单个参数的函数word并返回前面单词的平均长度 以字符为单位 word在文字中 如果单词恰好是文本中出现的第一个单词 则该出现的前一个单词的长度应为零 例如 gt gt gt average length the 4 4
  • 新创建的创作资源未显示在 Luis 门户中

    我在 Luis Portal 中添加了创作资源并导入了一些应用程序 添加的创作资源最初出现在 Azure 门户和 Luis 门户中 然后 资源突然在 Luis 门户中消失 现在我无法使用 应用程序 页面中的下拉菜单选择资源 因为它不再显示在
  • BrowserslistError:未知的 Android 版本 67

    我使用创建了一个角度库angular 8 and CLI 8 我正在尝试构建库 但收到错误 ng build
  • ruby 中最短的 hex2bin?

    在 ruby 中将十六进制字符串转换为二进制字符串的最短方法是什么 例如 class def hex2bin end end AB12345678 hex2bin class String def hex2bin scan map x x
  • JFileChooser 显示在全屏 JFrame 之外

    import java awt DisplayMode import java awt GraphicsDevice import java awt GraphicsEnvironment import java awt event Act
  • 如何更改文本块背景?

    这是我的xaml structure
  • 如何防止.exe类型文件在网站上传?

    假设我们有一个 example exe 文件 我们首先将该文件放入一个新文件夹中 然后使用任何压缩软件压缩该文件夹 我们可以阻止压缩文件夹在网站中上传吗 我们怎样才能做到这一点 你不能prevent它 因为在提交之前你无法知道浏览器将要提交
  • 为什么我获得了未分配内存的读写权限?

    我对下面代码片段的行为感到困惑 我已经声明了一个 char 指针并将其指向分配大小 1 sizeof char 的内存位置 char src src char malloc 1 sizeof char strcpy src Copy tex
  • 对 Rhino Mocks 中的方法调用进行计数

    所以 我想用比 An Ounce 或 At Least Once 更具体的方法来计算 Rhino Mocks 中的方法调用 有什么机制可以做到这一点吗 诀窍是使用 Repeat Times n 其中 n 是次数 令人惊讶的是 即使该方法的调
  • 如何在活动之前增加 Azure 数据工厂中的参数?

    我正在访问一个 RESTful API 该 API 使用 HTTP 连接器以 50 组为一组进行分页 REST 连接器似乎不支持客户端证书 因此我无法在其中使用分页 我有一个名为的管道变量SkipIndex默认为 0 在 Until 循环内
  • 行为 3 中如何在上下文之间进行通信?

    我无法再在版本 3 中使用 getMainContext 和 getSubcontext alias 版本 3 中上下文之间的通信方式是什么 上下文特征是唯一的方式吗 behat yml default suites guest featu
  • Android 中的电话选择器 api

    我正在尝试使用电话选择器 API 获取电话号码 但得到空响应 这是我的代码 GoogleApiClient googleApiClient new GoogleApiClient Builder this addApi Auth CREDE
  • Schema.org 中的产品列表

    我读了这个谷歌文档 https developers google com search docs data types products 它说我们不使用列表中的产品 那么对于产品列表 具有多页的类似产品类别 如 鞋子 建议使用哪种模式 我
  • 静态和粘性固定标题转换故障

    我创建了一个基于滚动的粘性标题 但有两个问题 上下滚动时 背景有跳跃 我希望你 明白我的意思 有时两个标题 div 一起出现 我该如何解决这个问题 提前致谢 JSFiddle 演示 http jsfiddle net ezBXc CSS m
  • 在 swift 中使用 NSClassFromString 实例化嵌套类

    我有一个如下定义的嵌套类 objc class A objc class B 我需要实例化A B using NSClassFromString 我能够在简单的课程中做到这一点A但是当我附加到NSClassFromString参数 Bstr