我有一个包含两个变量的结构。这个结构有变异函数,但是在这个函数中,我需要检查要变异的变量。为此,我使用具有复杂逻辑的单独类的静态函数。这个类与不同的结构一起工作,因此,出于干燥的目的,我不能在所有这些结构中表示这个逻辑。
问题是,我不知道如何从这个单独的类接收相同的struct变量,所以没有任何struct的变量会发生变异。我认为,我错过了一些斯威夫特的知识,因为我确信,这是可能的,没有重复的逻辑。
在游乐场中表示它的代码:
struct SomeStruct {
var a = "a"
var b = "b"
mutating func mutateString(to newString: String) {
var varToMutate = VariableDetector.whichVarToMutate(a, b)
varToMutate = newString
// prints to represent question
print("varToMutate: \(varToMutate)")
print("a: \(a)")
print("b: \(b)")
}
}
class VariableDetector {
static func whichVarToMutate(_ first: String, _ second: String) -> String {
var firstOrSecondString = ""
// simple logic to represent question, in real case it is far more complex
if first == "a" {
firstOrSecondString = first
} else {
firstOrSecondString = second
}
return firstOrSecondString
}
}
var someStruct = SomeStruct()
someStruct.mutateString(to: "c")
该代码生成:
varToMutate: c
a: a
b: b
是的,它可以通过以下方式解决:
if varToMutate == a {
a = newString
} else if varToMutate == b {
b = newString
}
但我想用更优雅的方式解决这个问题:)
谢谢你的帮助!
发布于 2017-07-06 14:58:18
在Swift 4中,这可以通过从KeyPath
返回whichVarToMutate
来实现。然后,可以使用KeyPath
访问有关实例,并对其表示的属性进行变异。
在Swift 3中,我可以想到两种方法:
inout
param进行变异,然后让闭包体对其进行变异。a
设置为( newValue )") a= newValue }{print(”将b
设置为(newValue)") b=newValue}s= SomeStruct() s.changeAppropriateVar( to:"foo"),则更复杂得多。发布于 2017-07-06 13:56:51
除非a
和b
是类的实例,否则varToMutate
只会是一个副本,因为在Swift中,除了类之外的所有内容都是值类型。也许可以试试UnsafeMutablePointer<T>
https://stackoverflow.com/questions/44950443
复制相似问题