gpt4 book ai didi

ios - 实例化存储在元类型字典中的类

转载 作者:行者123 更新时间:2023-11-28 06:18:16 26 4
gpt4 key购买 nike

我遵循了 Make a Swift dictionary where the key is "Type"? 的解决方案创建可以使用类类型作为键的字典。我想要做的是:我有一个字典应该存储类类型及其类类型(又名元类型)作为键:

class MyScenario {
static var metatype:Metatype<MyScenario> {
return Metatype(self)
}
}


var scenarioClasses:[Metatype<MyScenario>: MyScenario.Type] = [:]

然后我有方法来注册和执行场景:

public func registerScenario(scenarioID:MyScenario.Type) {
if (scenarioClasses[scenarioID.metatype] == nil) {
scenarioClasses[scenarioID.metatype] = scenarioID
}
}

public func executeScenario(scenarioID:MyScenario.Type) {
if let scenarioClass = scenarioClasses[scenarioID.metatype] {
let scenario = scenarioClass()
}
}

...问题在最后一行:

Constructing an object of class type 'MyScenario' with a metatype value must use a 'required' initializer.

看起来编译器在这一点上很困惑,因为我不能在那个赋值时使用“required”。有谁知道我将如何在 executeScenario() 中实例化 scenarioClass

最佳答案

这必须完成这项工作。

import Foundation

struct Metatype<T> : Hashable
{
static func ==(lhs: Metatype, rhs: Metatype) -> Bool
{
return lhs.base == rhs.base
}

let base: T.Type

init(_ base: T.Type)
{
self.base = base
}

var hashValue: Int
{
return ObjectIdentifier(base).hashValue
}
}

public class MyScenario
{
var p: String

public required init()
{
self.p = "any"
}

static var metatype:Metatype<MyScenario>
{
return Metatype(self)
}
}

var scenarioClasses:[Metatype<MyScenario>: MyScenario.Type] = [:]

public func registerScenario(scenarioID:MyScenario.Type)
{
if (scenarioClasses[scenarioID.metatype] == nil)
{
scenarioClasses[scenarioID.metatype] = scenarioID
}
}

public func executeScenario(scenarioID:MyScenario.Type)
{
if let scenarioClass = scenarioClasses[scenarioID.metatype]
{
let scenario = scenarioClass.init()
print("\(scenario.p)")
}
}

// Register a new scenario
registerScenario(scenarioID: MyScenario.self)

// Execute
executeScenario(scenarioID: MyScenario.self)

// Should print "any"

关于ios - 实例化存储在元类型字典中的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44453851/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com