代码之家  ›  专栏  ›  技术社区  ›  Carl

如何在Swift中将结构成员设置为成员函数

  •  0
  • Carl  · 技术社区  · 10 年前

    在此结构中

    struct {
        let type : SaveType
        var saveFunc : (value:AnyObject) 
    
        init(model:Model) {
            type = model.type
            // how to set saveFunc based on value of type
        }
    
        func save1(value:AnyObject) {...}
        func save2(value:AnyObject) {...}
    }
    

    的价值 type 一旦设置不改变。 如何设置成员变量 saveFunc 基于 类型 ?

    我希望调用者调用saveFunc(值),而不是检查 类型 变量并调用适当版本的save。

    我不想让别人打电话给我 每次 saveFunc被调用-所有需要的信息在init()时都可用-所以我想在init时设置此行为。

    很高兴收到不同的答案。

    2 回复  |  直到 10 年前
        1
  •  1
  •   Sulthan    10 年前

    有多种方法可以做到这一点,例如:

    struct {
        let type : SaveType
    
        init(model:Model) {
            type = model.type
        }
    
        private func save1(value:AnyObject) {...}
        private func save2(value:AnyObject) {...}
    
        // let's just decide internally what to call
        func save(value:AnyObject) {
           switch (type) {
              case .Type1:
                 save1(value)
              case .Type2:
                 save2(value)
           }
        }
    }
    

    但是,您可以在 init 并分配 save1 save2 saveFunc 。还有其他解决方案,但我认为它们都更复杂。

        2
  •  0
  •   David Berry    10 年前

    您可以使用闭包来执行您想要的操作:

    struct Foo {
        enum FooType {
            case A
            case B
        }
    
        var type : FooType
        var save : ((AnyObject)->())?
    
        private func saveA(arg:AnyObject) {
            print("saveA(\(arg))")
        }
    
        private func saveB(arg:AnyObject) {
            print("saveB(\(arg))")
        }
    
        init(type:FooType) {
            self.type = type
            switch type {
            case .A:
                save = saveA
            case .B:
                save = saveB
            }
        }
    }
    
    Foo(type: .A).save?(1)
    Foo(type: .B).save?(2)
    

    请注意,如果可以在创建对象后设置didSet类型,那么您可能还需要它。

    同样值得注意的是,这可能不是解决问题的正确方法。它看起来确实应该由子类和工厂模型的组合来处理,而不是由类型/开关解决方案来处理。