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

how to set-up a struct member to a member func in Swift

在此结构中

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的值一旦设置就不会改变。 如何根据 type 的值设置成员变量 saveFunc

我希望调用者调用 saveFunc(value) 而不是检查 type 变量并调用适当版本的保存。

我不希望开关被调用 每次 saveFunc 被调用 - 所有需要的信息在 init() 时可用 - 所以我想设置这个初始时的行为。

很高兴收到不同的答案。

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

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 中做出相同的决定,并将 save1save2 分配给 saveFunc。还有其他解决方案,但我认为它们都比较复杂。

你可以使用闭包来做你想做的事:

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。

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