Можно ли изменить массив внутри функции класса в SwiftUI / Swift? - PullRequest
0 голосов
/ 25 мая 2020

Если я объявил массив внутри класса, можно ли изменить этот массив с помощью одной из функций класса? Я надеялся, что есть какой-то эквивалент ключевого слова mutating, который можно использовать для классов:

class className: ObservableObject {
    @Published var arrayName: [arrayType] = []

    func mutateArray(address: String) {
        self.arrayName = []
        let geocoder = Geocoder(accessToken: 'accessTokenHere')
        geocoder.geocode(ForwardGeocodeOptions(query: address) { (placemarks, attribution, error) in 
        guard let placemarks = placemarks
        else {
            return
        }
        self.arrayName = [value1, value2, value3]
        //This only updates the array inside this closure/context. Is there any way to have the update persist after the function has ended?
    }
}

Ответы [ 2 ]

2 голосов
/ 25 мая 2020

Классы не нуждаются в эквиваленте для mutating, потому что это ссылочный тип, в отличие от структур, которые являются типом значения, поэтому для него требуются функции mutating. Попробуйте этот код на своей игровой площадке Xcode:

import Foundation

class className {
    var arrayName: [String] = []

    func mutateArray() {
        arrayName = ["value1", "value2", "value3"]
    }
}
let object = className()
print(object.arrayName)
object.mutateArray()
print(object.arrayName)
0 голосов
/ 25 мая 2020

Опубликованные свойства должны быть обновлены в основной очереди, поэтому выполните следующие действия:

class ClassName: ObservableObject {
    @Published var arrayName: [arrayType] = []

    func mutateArray(address: String) {
        self.arrayName = []
        let geocoder = Geocoder(accessToken: 'accessTokenHere')
        geocoder.geocode(ForwardGeocodeOptions(query: address) { [weak self] (placemarks, attribution, error) in
            guard let placemarks = placemarks
                else {
                    return
            }
            DispatchQueue.main.async {     // << here !!
                self?.arrayName = [value1, value2, value3] // << weak for safety
            }
        }
    }
}
...