我正在嘗試修改 forEach 中陣列中的值,但出現此錯誤:Cannot assign to property: 'place' is a 'let' constant我不知道為什么。我的陣列都是由var而不是由let...定義的
我的結構定義:
struct Place: Identifiable{
let id = UUID().uuidString
var lat: Double
var long: Double
var Name: String
var proximity: Double
init (lat: Double, long: Double, Name: String, proximity: Double){
self.lat = lat
self.long = long
self.Name = Name
self.proximity = proximity
}
init(config: NewPlaceConfig){
self.lat = config.lat
self.long = config.long
self.Name = config.Name
self.proximity = config.proximity
}
}
我的 NewPlaceConfig 定義:
struct NewPlaceConfig{
var lat: Double
var long: Double
var Name: String
var proximity: Double
}
我的資料定義:
class PlaceLibrary: ObservableObject{
@Published var testPlace = [
Place(lat: 46.1810, long: 6.2304, Name: "Text1", proximity: 0.0),
Place(lat: 46.1531, long: 6.2951, Name: "Text2", proximity: 0.0),
Place(lat: 46.1207, long: 6.3302, Name: "Text3", proximity: 0.0)
]
}
最后是我遇到問題的代碼:
[...]
@ObservedObject var placeLibrary: PlaceLibrary
[...]
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let location = locations.last else { return }
lastLocation = location
ForEach(placeLibrary.testPlace){place in
let currentLocation = CLLocation(latitude: (self.lastLocation?.coordinate.latitude) ?? 0.0, longitude: (self.lastLocation?.coordinate.longitude) ?? 0.0)
let comparedLocation = CLLocation(latitude: place.lat, longitude: place.long)
place.proximity = currentLocation.distance(from: comparedLocation) //HERE IS THE LINE WITH THE PROBLEM
}
}
實際上,我只想將當前用戶位置與陣列中每個位置的保存位置進行比較,然后在我的陣列中添加用戶與保存位置之間的當前距離。我想在proximity我的陣列的框中添加更新這個值,這就是我寫這一行的原因:
place.proximity = currentLocation.distance(from: comparedLocation)
但是沒有任何成功,我不知道為什么?
謝謝你的幫助。
uj5u.com熱心網友回復:
在您的代碼中,SwiftUI 和 Swift 之間存在一些混淆。
ObservableObject并且在 SwiftUI 視圖中使用相關的@ObservedObject屬性包裝器來保存狀態并在觀察物件的已發布屬性發生更改時更新視圖。- 你的函式
locationManager是一個普通的 Swift 函式。它不回傳視圖。 ForEach是一個回傳視圖的 SwiftUI 函式。
因此,如果沒有更好地了解您的代碼,就很難回答這個問題。
然而,一般來說,任何類似 foreach 的構造(ForEach您正在使用的 SwiftUI 視圖、.forEach { }在陣列上呼叫的方法或經典for x in list { }語法)都會為您提供您正在遍歷的陣列中元素的副本,而不是實際的元素。是的,這些forEach交給你的副本是只讀的 - 讓 - 常量。
當您回圈遍歷一組類時,這無關緊要。類是一種參考型別,因此您在每個 foreach 回圈中獲得的“副本”是對遍歷陣列中實際元素的參考。
然而,結構是值型別。foreach 回圈為您提供的“副本”在物理上與陣列中的元素不同。即使您能夠對其進行變異,您正在回圈的實際陣列中的實際元素也不會被更新。
如果您需要迭代結構陣列并更新(部分)其元素,最好的辦法是迭代陣列的索引,然后通過陣列的下標訪問要更新的實際元素:
for idx in placeLibary.testPlace.indices {
// Calculate stuff
// ...
// Update the array
placeLibrary.testPlace[idx].proximity = newProximity
}
如果您還需要讀取實際元素的屬性(例如計算示例中的comparedLocation變數),您可以使用enumerated(),它會同時為您提供索引和元素。但是,永遠不要忘記更新實際串列,而不是(只讀)元素!
for (idx, readOnlyPlace) in placeLibary.testPlace.enumerated() {
// Calculate stuff
let currentLocation = CLLocation(latitude: (self.lastLocation?.coordinate.latitude) ?? 0.0, longitude: (self.lastLocation?.coordinate.longitude) ?? 0.0)
let comparedLocation = CLLocation(latitude: readOnlyPlace.lat, longitude: readOnlyPlace.long)
// Update the array
placeLibrary.testPlace[idx].proximity = currentLocation.distance(from: comparedLocation)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/531178.html
標籤:数组迅捷前锋
下一篇:將資料從一個表拆分到另一個表
