如何在 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
中做出相同的决定,并将 save1
或 save2
分配给 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 解决方案来处理。
在此结构中
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
中做出相同的决定,并将 save1
或 save2
分配给 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 解决方案来处理。