【发布时间】:2021-08-03 09:37:34
【问题描述】:
假设我有一个静态函数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...)
应该为 iPhone 返回 MyClass 的实例,为 iPad 返回 MyClass_iPad 的实例。
有什么建议?也许使用协议?
【问题讨论】:
-
听起来像 factory pattern 对我来说
-
为什么不让
MyClass和MyClass_iPad遵循相同的协议呢?然后,您可以调用方法并获取当时存储在内存中的任一方法的属性。 -
你需要一个协议而不是我所看到的泛型。创建一个包含 MyClass 中所有公共属性和方法的协议,并声明 classForDevice 以返回该协议
-
考虑:将 MyClassIpad 设为 MyClass 的子类,然后当您需要新建 MyClass 时,让它根据设备返回 MyClass 或 MyClassIpad,但作为 MyClass。不需要协议。
-
鉴于 cmets 中提供的解决方案的多样性,我投票决定以固执己见的方式结束这个问题。如果您选择一条路径并尝试实施它,然后在遇到任何问题时返回一个新问题,这可能会更好。