構造体変数 (S) を持つクラス (A) があります。このクラスの 1 つの関数で、構造体変数の変更関数を呼び出します。この関数はクロージャを取ります。このクロージャの本体は、構造体変数の name プロパティをチェックします。
Struct の変更関数は、あるクラス (B) の関数を順番に呼び出します。このクラスの関数は再びクロージャーを取ります。このクロージャの本体で、構造体を変更します。つまり、name プロパティを変更し、最初のクラスによって提供されたクロージャを呼び出します。
最初のクラス (A) クロージャーが構造体の name プロパティを検査している場所で呼び出されると、それは決して変更されません。
しかし、ステップ 2 で、クラス B の代わりに構造体 (C) を使用すると、クラス A のクロージャー構造体の内部が実際に変更されていることがわかります。以下はコードです:
class NetworkingClass {
func fetchDataOverNetwork(completion:()->()) {
// Fetch Data from netwrok and finally call the closure
completion()
}
}
struct NetworkingStruct {
func fetchDataOverNetwork(completion:()->()) {
// Fetch Data from netwrok and finally call the closure
completion()
}
}
struct ViewModelStruct {
/// Initial value
var data: String = "A"
/// Mutate itself in a closure called from a struct
mutating func changeFromStruct(completion:()->()) {
let networkingStruct = NetworkingStruct()
networkingStruct.fetchDataOverNetwork {
self.data = "B"
completion()
}
}
/// Mutate itself in a closure called from a class
mutating func changeFromClass(completion:()->()) {
let networkingClass = NetworkingClass()
networkingClass.fetchDataOverNetwork {
self.data = "C"
completion()
}
}
}
class ViewController {
var viewModel: ViewModelStruct = ViewModelStruct()
func changeViewModelStruct() {
print(viewModel.data)
/// This never changes self.viewModel inside closure, Why Not?
viewModel.changeFromClass {
print(self.viewModel.data)
}
/// This changes self.viewModel inside/outside closure, Why?
viewModel.changeFromStruct {
print(self.viewModel.data)
}
}
}
var c = ViewController()
c.changeViewModelStruct()
なぜこの異なる動作。差別化要因は、viewModel に構造体を使用するか、クラスに使用するかであると考えました。ただし、ここでは、Networking がクラスであるか構造体であるかに依存し、ViewController または ViewModel から独立しています。誰でもこれを理解するのを手伝ってもらえますか?