У меня есть класс (A), который имеет структурную переменную (S). В одной функции этого класса я вызываю мутирующую функцию в переменной struct, эта функция принимает замыкание. Тело этого закрытия проверяет свойство имени переменной struct.
Структурная мутирующая функция по очереди вызывает функцию некоторого класса (B). Эта функция класса снова принимает замыкание. В этом теге замыкания мутируйте структуру, т.е. Измените свойство name и вызовите закрытие, которое было предоставлено первым классом.
Когда замыкание первого класса (A) вызывается там, где мы проверяем свойство struct name, оно никогда не изменяется.
Но на шаге 2, если я использую struct (C) вместо класса B, я вижу, что внутри класса 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. Может ли кто-нибудь помочь мне понять это?