代码之家  ›  专栏  ›  技术社区  ›  Charlie Fish

Swift类作为参数稍后实例化

  •  0
  • Charlie Fish  · 技术社区  · 6 年前

    我有下面的Swift代码。我的目标是能够通过的类型或类的任何一个 FirstItem SecondItem 进入 Manager 以后能够实例化(通过调用 createItem

    protocol CustomItem {
        static func instantiate() -> CustomItem
    }
    class FirstItem: CustomItem {
        static func instantiate() -> CustomItem {
            return FirstItem()
        }
    }
    class SecondItem: CustomItem {
        static func instantiate() -> CustomItem {
            return SecondItem()
        }
    }
    class Manager {
        var itemClass: CustomItem
    
        func createItem() {
            let itemInstance = itemClass.instantiate()
        }
    
        init(itemClass: CustomItem) {
            self.itemClass = itemClass
        }
    }
    let manager = Manager(itemClass: FirstItem)
    

    如何修复上面的代码以允许这样做,从而使管理器接受类本身而不是类的实例。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Charlie Fish    6 年前

    通过将init函数中接受的参数类型更改为 CustomItem.Type 以及更改传递给的值 FirstItem.self 这很管用。例如,将代码更改为以下内容应该可以。

    protocol CustomItem {
        static func instantiate() -> CustomItem
    }
    class FirstItem: CustomItem {
        static func instantiate() -> CustomItem {
            return FirstItem()
        }
    }
    class SecondItem: CustomItem {
        static func instantiate() -> CustomItem {
            return SecondItem()
        }
    }
    class Manager {
        var itemClass: CustomItem.Type
    
        func createItem() {
            let itemInstance = itemClass.instantiate()
        }
    
        init(itemClass: CustomItem.Type) {
            self.itemClass = itemClass
        }
    }
    let manager = Manager(itemClass: FirstItem.self)