我有一個結構與2個變量。這個結構具有變異函數,但是在這個函數中我需要檢查變異的變量。爲此,我使用獨立的類'靜態函數與複雜的邏輯。這個類適用於不同的結構,所以對於DRY而言,我不能在所有這些結構中表示這種邏輯。突變func與外部檢測哪個變量變異
的問題是,我不知道如何從這個單獨的類接收相同結構的變化,所以沒有結構的變量發生變異。我想,我錯過了一些斯威夫特的知識,因爲我敢肯定,這是可能的,沒有重複的邏輯。
代碼來表示它在遊樂場:
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
}
但我想解決這個問題以更優雅的方式:)
感謝您的幫助!
在一個側面說明,這不是很習慣使用類只定義靜態方法。要麼你可以讓這些方法爲功能與狹窄的訪問說明符(如'fileprivate'或'internal',從而限制全局命名空間的人口),也可以使用小寫的'enum'(保護,防止意外實例) – Alexander