首页 > 解决方案 > 设备的 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...)

应该返回MyClassiPhone 的实例和MyClass_iPadiPad 的实例。
有什么建议么?也许使用协议?

标签: iosswiftgenerics

解决方案


我最终为此创建了一个通用类:

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 的实例


推荐阅读