ios - 设备的 Swift 泛型类
问题描述
假设我有一个静态函数isDeviceIpad
。
对于任何支持 iPad 的类,我得到了带有“_iPad”后缀的子类,以及里面的所有 iPad 逻辑。
我使用classForDevice
函数来为我当前的设备获取正确的类,如下所示:
static private let iPadClassSuffix = "_iPad"
static func classForDevice() -> AnyClass? {
var iPadClass: AnyClass?
let moduleName = Bundle.main.infoDictionary!["CFBundleName"] as! String
let swiftClassName = moduleName+"."+String(describing: self)
if isDeviceIpad {
let iPadClassName = swiftClassName+iPadClassSuffix
iPadClass = Bundle.main.classNamed(iPadClassName)
}
return iPadClass ?? Bundle.main.classNamed(swiftClassName)
}
现在我想将此函数转换为使用泛型,例如:
如果我的课程是MyClass
并且我的 iPad 课程是MyClass_iPad
let myClass = MyClass.classForDevice().init(with parameters...)
应该返回MyClass
iPhone 的实例和MyClass_iPad
iPad 的实例。
有什么建议么?也许使用协议?
解决方案
我最终为此创建了一个通用类:
class DeviceHandler<T: AnyObject> {
static var classForDevice: T.Type {
var iPadClass: T.Type?
let iPadClassSuffix = "_iPad"
let moduleName = Bundle.main.infoDictionary!["CFBundleName"] as! String
let swiftClassName = moduleName+"."+String(describing: T.self)
if Utils.isDeviceIpad {
let iPadClassName = swiftClassName+iPadClassSuffix
iPadClass = Bundle.main.classNamed(iPadClassName) as? T.Type
}
return iPadClass ?? T.self
}
}
然后我像这样使用它:
let myClass = DeviceHandler<MyClass>.classForDevice.init(with parameters...)
编辑:更改classForDevice
为静态变量,因此我不需要创建 DeviceHandler 的实例
推荐阅读
- docker - Docker 未满足的依赖项:nvidia-docker2
- templates - 在我的 MediaWiki 站点中使用 MediaWiki 注释模板
- vue.js - 删除所有项目的类并将类添加到单击的项目中 Vue.js
- php - 如何将 Angular 6 POST 值发送到 Codeigniter 函数?
- wordpress - 如何在 wordpress 中的 wp_list_table 中执行单个删除和批量删除操作?
- sql - 我们可以在 Oracle DB 11g 中更新表中的记录并同时将更新的记录插入到另一个表中吗
- jmeter - 使用 jmeter 的 odoo 性能(错误请求 CSRF 令牌)
- indexing - Neo4j 快速匹配模糊文本属性的方法
- webhooks - 如何将 rundeck 作业结果发布到 webhook
- android - 如何在工具栏中设置 MenuItem 文本而不是图标