如何分配一個可以具有泛型型別的類的實體,但直到運行時您才知道它是什么型別?
例如。
我們有一個符合它的協議和列舉,如下所示:
protocol Stage: CaseIterable, Hashable {
var fooBarLength: Int { get }
}
enum FirstStage: String, Stage {
var fooBarLength: Int { 10 }
case section1
case section2
}
enum SecondStage: String, Stage {
var fooBarLength: Int { 10 }
case section1
case section2
case section3
}
接下來我們有某種控制器將協議用作泛型型別...comme?a...
class FooBarController<StageType: Stage>: UIViewController {
private var stages: [StageType: Float] = [:]
}
然后像這樣使用:
func fooBarScreen(boop: SomethingThatKnowsAboutTheStages) {
var fooBarController: FooBarController // <---- how do I define this????
if boop.someCondition() {
fooBarController = FooBarController<FirstStage>()
} else {
fooBarController = FooBarController<SecondStage>()
}
}
在 Java / Kotlin 中我可以像上面那樣做,我如何在 Swift 中實作同樣的事情?
目前我得到
"Reference to generic type 'FooBarController' requires arguments in <...>"
次要問題
有沒有比在這里使用 if 陳述句更通用的方法?理想情況下,我希望該fooBarScreen方法不關心泛型型別,而只SomethingThatKnowsAboutTheStages為我提供型別。
uj5u.com熱心網友回復:
您可以指定一個協議來提供Stage如下型別:
protocol StageProvider {
associatedtype T: Stage
func getType() -> T.Type
}
然后讓您SomethingThatKnowsAboutTheStages或任何其他人遵守此協議:
class SomethingThatKnowsAboutTheStages: StageProvider {
typealias T = SecondStage
func getType() -> T.Type {
SecondStage.self
}
}
為您添加一個初始化程式FooBarController:
class FooBarController<StageType: Stage>: UIViewController {
convenience init(stage: StageType.Type) {
self.init()
}
}
最后使用所有這些:
func fooBarScreen<T: StageProvider>(boop: T) {
let controller = FooBarController(stage: boop.getType())
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/460186.html
下一篇:找不到派生類的Lombok建構式
