【问题标题】:Unable to create a Entity with some parameters无法使用某些参数创建实体
【发布时间】:2018-05-20 18:35:01
【问题描述】:

我尝试使用参数以通用方式初始化一个类,但它不起作用...

protocol EntityCreator: class {
    func createEntity<EntityType: EntityClass & EntityCreatorInitializable>(type: EntityType.Type, _ initialize: @escaping (EntityType) -> Void)
}

protocol EntityCreatorInitializable {
    init(entityCreator: EntityCreator)
}

class EntityClass: NSObject { }

class MyClass: EntityClass, EntityCreatorInitializable {
    required init(entityCreator: EntityCreator) {
        super.init()
        // use the entityCreator
    }
}

// On the entity creator implementation :

class EntityCreatorImplementation: EntityCreator {
    var toAdd = Set<EntityClass>()

    func createEntity<EntityType: EntityClass & EntityCreatorInitializable>(type: EntityType.Type, _ initialize: @escaping (EntityType) -> Void) {
        // This creation doesn't work...
        let newEntity = EntityType(entityCreator: self)
        initialize(newEntity)
        self.toAdd.insert(newEntity)
    }
}

我在编译时遇到的错误是

非名义类型 'EntityType' 不支持显式初始化

关于如何实现这一点的任何想法?

谢谢!!

EDIT:我添加了EntityClass的定义。在我的项目中,它是一个 GKEntity,但问题与 NSObject 相同

EDIT : 添加了 toAdd Set,忘记声明了(但在 createEntity 方法中使用)

【问题讨论】:

标签: swift generics protocols


【解决方案1】:

改变

EntityType: EntityClass & EntityCreatorInitializable

EntityType: EntityCreatorInitializable

【讨论】:

  • 但是这样一来,self.toAdd.insert(newEntity) 行不行,因为 toAdd 是一组EntityClass....我可以用as! EntityClass 但是太丑了...
  • 但是您在发布的代码中没有显示toAdd.insert 的定义。所以我不得不对此发表评论。您必须发布最小完整可验证示例代码。正如你所说的,如果你以某种方式知道这也是一个EntityClass,那么你可以转换它。你的结构很奇怪,我不知道它的目的;我所做的只是让您克服您抱怨的编译错误,我认为我成功地做到了。
【解决方案2】:

如果你希望能够初始化很多不同的类型,你应该定义一个新的协议,检查这个answer

protocol EntityCreator: class {
        func createEntity<EntityType: EntityClass & EntityCreatorInitializable>(type: EntityType.Type, _ initialize: @escaping (EntityType) -> Void)
    }

    protocol EntityCreatorInitializable {
        init(entityCreator: EntityCreator)
    }

    class EntityClass: NSObject { }

    class MyClass: EntityClass, EntityCreatorInitializable {
        public required init(entityCreator: EntityCreator) {
            super.init()
            // use the entityCreator
        }
    }

    // On the entity creator implementation :

    class EntityCreatorImplementation: EntityCreator {
        func createEntity<EntityType: EntityCreatorInitializable>(type: EntityType.Type, _ initialize: @escaping (EntityType) -> Void) {

            // This creation doesn't work...
            let newEntity = EntityType.init(entityCreator:self)
           // initialize(newEntity)
           // self.toAdd.insert(newEntity)
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-30
    • 2022-01-17
    • 2014-09-30
    • 2020-07-05
    • 1970-01-01
    • 2018-04-22
    • 2023-04-03
    • 2019-05-28
    相关资源
    最近更新 更多