是否可以从字符串中获取 Swift 类型?

2024-03-27

我想知道是否可以动态获取 Swift 类型。例如,假设我们有以下嵌套结构:

struct Constants {

  struct BlockA {
    static let kFirstConstantA = "firstConstantA"
    static let kSecondConstantA = "secondConstantA"
  }

 struct BlockB {    
    static let kFirstConstantB = "firstConstantB"
    static let kSecondConstantB = "secondConstantB"
  }

  struct BlockC {
    static let kFirstConstantC = "firstConstantBC"
    static let kSecondConstantC = "secondConstantC"
  }
}

可以从变量的 kSeconConstantC 中获取值)。喜欢:

let variableString = "BlockC"
let constantValue = Constants.variableString.kSecondConstantC

类似于NSClassFromString, maybe?


不,这还不可能(至少作为一种语言功能)。

你需要的是你自己的类型注册表。即使使用类型注册表,您也无法获得static常量,除非你有一个协议:

var typeRegistry: [String: Any.Type] = [:]

func indexType(type: Any.Type)
{
    typeRegistry[String(type)] = type
}

protocol Foo
{
    static var bar: String { get set }
}

struct X: Foo
{
    static var bar: String = "x-bar"
}

struct Y: Foo
{
    static var bar: String = "y-bar"
}

indexType(X)
indexType(Y)

typeRegistry // ["X": X.Type, "Y": Y.Type]

(typeRegistry["X"] as! Foo.Type).bar // "x-bar"
(typeRegistry["Y"] as! Foo.Type).bar // "y-bar"

类型注册表是使用自定义注册类型的东西Hashable类型(比如说String or an Int)。然后,您可以使用此类型注册表来引用使用自定义标识符(aString, 在这种情况下)。

Since Any.Type本身并没有那么有用,我构建了一个接口Foo通过它我可以访问静态常量bar。因为我知道X.Type and Y.Type两者都符合Foo.Type,我强制转换并阅读了bar财产。

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

是否可以从字符串中获取 Swift 类型? 的相关文章

  • Swift 2.0 中的 countForFetchRequest

    我正在尝试使用countForFetchRequestSwift 2 0 中托管对象上下文上的方法 我注意到错误处理executeFetchRequest已更改为新的do try catch syntax func executeFetch
  • 使用 AlamofireImage 下载图像有进度吗?

    有没有办法使用 AlamofireImage 下载图像并获得有关下载进度的某种反馈 同时利用它的强大功能UIImage 扩展 图像过滤器和图像缓存 我知道我可以退回到平原Alamofire request responseImage但我想让
  • 当 tableView 向下滑动时显示 UISearchController

    我通过 UISearchController 在我的测试应用程序中实现了搜索栏 当我启动应用程序时 我会在导航控制器下方看到搜索栏 但如何在应用程序启动时隐藏它并仅在下拉表格视图时显示它 并在拉出表格视图时再次隐藏 我在google或you
  • 是否可以仅使用密码进行身份验证,即使设备在 ios、swift 中具有 touch id 功能

    我要认证only使用PassCode甚至设备有Touch ID特征 我在用着 deviceOwnerAuthentication评估政策方法 当我使用这个时 如果用户已注册触摸 ID gt 始终要求提供触摸 ID 如果用户尚未注册 touc
  • Swift 4.2 当键盘显示时使 tableView 的底部向上移动

    尽管我已经进行了搜索 但我对如何最好地解决这个问题感到困惑 我有一个 tableView 其中底部单元格是列表的输入 就像苹果提醒的工作方式一样 当列表中的项目太多时 键盘会覆盖列表 我看不到正在输入的内容 我认为我需要更改表视图的物理大小
  • 如何使用 Apple Map Kit 实现地址自动完成

    我想自动填写用户的地址 与 google api 在此链接中提供的地址相同 https developers google com maps documentation javascript places autocomplete hl e
  • 故事板入口点缺失

    在 xcode 7 2 中 对象列表中没有 Storyboard Entry Point 项 我需要使用 Storyboard Entry Point 我通过谷歌搜索找不到任何类似的问题 所以任何人都可以在这里帮助我 单击要作为情节提要入口
  • 如何避免强制解包变量?

    我如何避免使用 执行强制解包操作 因为使用它通常是一个糟糕的选择 对于像下面这样的代码 什么是更好的选择 使用它使代码看起来更简单 并且因为 if 检查变量 被调用的永远不会为零 因此不会崩溃 我的老师向我们介绍了 bang 运算符 然后告
  • 如何通过 CollectionView 中的流布局将单元格对齐到顶部

    在此代码中 我尝试更改 UICollectionView 的第一个单元格的大小以及具有相同大小的其他单元格的大小 但在第一行中 当我想要两个单元格出现时 只有一个单元格出现 func collectionView collectionVie
  • 同一参数有两个不同的名称有什么意义?

    func mapEachElement inArray arr Int withFunc aFunc Int 为什么会有 inArray 然后 arr 有什么意义 对于 withFunc 和 aFunc 也是如此 它使代码变得更加复杂并且阅
  • 禁用将应用程序窗口置于前面。关闭另一个窗口后

    我有包含 2 个 NSWindowController 的 OSX 应用程序 我的问题可以通过以下几个步骤来描述 使用 2 个窗口启动应用程序 选择另一个应用程序的窗口 将其中一个窗口放在另一个应用程序窗口前面 第二个窗口将保留在底部 关闭
  • 为什么在快速合并两个视频或更改背景音乐后视频变成黑屏?

    在我的 ios 应用程序中 我想合并两个视频并更改背景音乐 我尝试过 对于普通视频来说效果很好 但是 当我选择任何延时视频 然后尝试合并或更改背景音乐时 视频变成全黑屏 对于我的应用程序 我使用 swift 4 2 和 xcode 10 我
  • Swift 从照片库中获取视频的 NSData

    我使用 UIImagePickerController 从我的库中选择视频 我需要提取视频文件的 NSData 我使用以下操作从我的库中选择视频 但我的数据似乎为零 但是我的 AVPlayer 播放生成的 NSURL 中的视频 所以我知道问
  • 使用 Swift 解析框架

    有人尝试过将 Parse Framework 与 swift 一起使用吗 只要添加桥接文件 您就可以使用 swift 和 Objective C 代码 这是我的查询 从 Parse 返回的 对象 数组正确地包含了我的所有数据 但该方法在将
  • 如何在运行时更改 UIMenu 内 UIAction 的状态?

    如何更改 UIAction 的状态 目标是切换 UIMenu 内 UIAction 旁边的状态复选标记 更改 UIAction 的state通过存储在视图控制器中的引用似乎根本不会改变状态 我错过了什么吗 View Controller i
  • 使用 Swift 选择 NSTextField 中的所有文本

    如何使用 Swift 以编程方式选择 NSTextField 中的所有文本 对于 UITextField 有一个类似的方法 textField selectedTextRange textField textRangeFromPositio
  • Swift 生成器上的链式表达式错误

    迅速回复 zip 1 2 3 7 8 9 generate next repl swift 1 22 error value of type Zip2Generator
  • 将深层链接传递到 iOS 模拟器?

    我想找到一种更简单的方法来在 iOS 模拟器中调用深层链接 在 Android 上 您可以使用 ADB 通过控制台将链接传输到模拟器中 是否有类似的方法或解决方法来打开最新 iOS 模拟器的深层链接 您可以在终端中输入以下内容 xcrun
  • 如何将计算值转换为文字以进行枚举初始化

    我遇到了枚举的问题 因为我想将 case 初始化为双精度值PI 180 有没有办法通过常量或一些时髦的魔法获取这个计算值并将其转换为文字 以便我可以初始化枚举 我宁愿不必做3 14 我宁愿使用该值的实际编译器和硬件计算表示 所以我的第一次尝
  • 将对象映射到 TableView 部分的 Swift 二维数组

    我想不出更好的方法来做到这一点 我将学生对象的所有属性映射到二维数组中 所以我的电视有几个部分 我也不能使用静态表视图 如果是这样 这个问题就不会存在 所以我在 TVC 中的代码 let currentUser PFUser current

随机推荐

  • 使用密码保护关闭的工作簿

    我已经搜索过 但没有找到在关闭的工作簿上添加外部密码的方法 假设我已经关闭了名为 Sample xlm 的工作簿 并且我正在打开一个名为 Test xlm 的工作簿 是否有代码可以让我在 Sample xlsm 上设置密码 我的意思是外部密
  • 空状态页面和导航器问题?

    我想实施空状态页 https material io design communication empty states html content在 Flutter 应用程序中 当新闻源为空时 当提要中没有活动时 我想显示 没有活动 当数据
  • 如何将服务变量与组件 Angular 2 绑定?

    我有一个变量 public tick number 在服务中 该服务注入了另一个服务计时器 它的启动方式如下 class Service constructor public timer TimerService public sendSm
  • Python 和类似字典的对象

    我需要一个用于字典的 python 3 1 深度更新函数 该函数将递归更新父字典内的子字典 但我认为 将来 我的函数可能必须处理行为类似于字典但实际上并非如此的对象 此外我想避免使用isinstance and type 因为它们被认为是不
  • 无法运行 React-Native UIExplorer 示例项目

    我一直在尝试在 Windows 上运行 UIExplorer 项目 我收到以下错误 make D react native ReactAndroid build tmp buildReactNdkLib local armeabi v7a
  • Gunicorn + nginx:通过套接字还是代理服务器?

    我见过两种使用 Gunicorn 和 nginx 托管 django 应用程序的策略 一种策略是在网络端口上运行 Gunicorn 例如 来自goodcode https goodcode io articles django nginx
  • jQuery TouchSwipe 插件不适用于链接?

    我正在使用 jQuery TouchSwipe 插件 它在 div 上工作得很好 但在链接上根本不起作用 我想要它 因此如果您点击或单击链接 您将获得默认的链接行为 但是如果你滑动 我希望 javascript 滑动能够像元素是 div 一
  • Java 相当于 .NET Action 和 Func 等[重复]

    这个问题在这里已经有答案了 Java 中是否有标准的通用 回调 或 函数 方法 类型 例如System Action
  • ASP.NET 网站项目何时重新编译?

    As Maurico https stackoverflow com users 21239 mauricio scheffer and codeka https stackoverflow com users 241462 codeka首
  • 如何使用 Ecto 的时间戳向现有表添加时间戳?

    Since inserted at and updated at不可能是null这是行不通的 def change do alter table channels do timestamps end end Postgrex Error E
  • 在 Outlook 2013 中调用功能区按钮

    我们有一个 Outlook 插件 我们需要以编程方式取消任务项检查器窗口中的任务分配 就像取消分配按钮一样 人们会认为调用TaskItem CancelResponseState 可能会起作用 虽然它确实取消了分配 但它也使任务处于不可分配
  • 使用 RequestAnimationFrame 实现准确计时

    到目前为止 我还没有找到很多关于这个主题的文档 我的总体感觉是 在为浏览器实现动画时 最好使用 RequestAnimationFrame 而不是 bog 标准 JavaScript 计时器 我的理解是计时器不可靠 并且它们的分辨率在不同浏
  • Windows 8 Phone - 访问 NFC 读卡器?

    简短的问题 我可以使用支持 NFC 的 Windows Phone 8 读取信用卡信息吗 长问题 NFC 与信用卡如何工作 卡 或具有钱包功能的手机 通过 NFC 接收请求并以某种标准化格式回复明文信用卡信息 那么 钱包选项在广播信用卡信息
  • 传送仅公开 C api 的 C++ dll

    我正在编写一个软件 其 API 仅为 C 语言 因为很容易将 C 代码与其他软件 客户端链接起来 然而 实际的程序代码是用 C 完成的 使用所有常见的 C 功能 如异常 STL 等 导出的 API 标头本身将用纯 C 编写 其中export
  • 如何使用 pandas tz_convert 转换为多个不同时区

    我有一些数据如下所示hour以世界标准时间 UTC 表示 我想创建一个名为的新列local hour基于time zone 我怎样才能做到这一点 好像是熊猫的tz convert不允许列或 pandas 系列作为输入tz争论 Create
  • Rails ActionController::Metal 的实际作用是什么

    我想了解一下Rails ActionController 金属控制器 我读过相关内容here http api rubyonrails org classes ActionController Metal html但不完全理解 它用于构建
  • 对 DataGrid 组进行排序

    我有一个非常基本的DataGrid以及一些测试数据 数据作为ObservableCollection
  • 应用程序崩溃时 QSharedMemory 不会被删除

    我正在使用实现一个应用程序Qt C 我用过的地方QSharedMemory限制应用程序的多个实例 相关代码段在main cpp如下 QSharedMemory sharedMemory sharedMemory setKey SM INST
  • 用于对重复 UPDATE 进行 UPSERT 或 INSERT 的 MERGE 语法

    所以我来自 MySQL 我可以做插入重复更新 http dev mysql com doc refman 5 0 en insert on duplicate html INSERT INTO table a b c VALUES 1 2
  • 是否可以从字符串中获取 Swift 类型?

    我想知道是否可以动态获取 Swift 类型 例如 假设我们有以下嵌套结构 struct Constants struct BlockA static let kFirstConstantA firstConstantA static let