假设:
var malls: [Mall] = [
Mall(name:"yagey", distance:""),
Mall[name:tigey", distance:"")
]
如何将distance
设置为其他字符串?
for mall in malls {
distance = distanceInMeters
}
没有工作。
谢谢!
import Foundation
struct Mall {
let name: String
let type: String
let image: String
let time: String
let timeWeek: String
let city: String
let location: String
let adress: String
let cinemaName: String
let productName: String
let numShop: String
let website: String
let schemeWeb: String
let longitude: Double
let latitude: Double
var distance: String
}
错误:
Cannot assign to property: 'mall' is a 'let' constant
˚F
func mallToDisplayAt(indexPath: IndexPath) -> Mall {
var mall: Mall
if searchController.isActive && searchController.searchBar.text != "" {
mall = filteredResultArray[indexPath.row]
} else {
mall = malls[indexPath.row]
}
return mall
}
的tableView
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! EateriesTableViewCell
let mall = mallToDisplayAt(indexPath: indexPath)
let mallLocate = CLLocation(latitude: mall.latitude, longitude: mall.longitude)
print (mallLocate)
let distanceInMeters = mallLocate.distance(from: coords) / 1000
let distanceInMetersString = String(format: "%.1f", distanceInMeters)
cell.distanceLabel.text = distanceInMetersString + "км"
for mall in malls {
distance = distanceInMeters
} return cell
}
答案 0 :(得分:1)
因为struct是值类型而不是引用类型,修改副本不会反映对副本的更改。默认情况下,for
循环为您提供let
常量,这是不可变的。所以你不能修改它。
你应该这样做:
malls = malls.map { mall in
var newMall = mall
newMall.distance = distanceInMeters
return newMall
}
您收到的错误是
无法分配属性:'mall'是'let'常量
这意味着mall
是一个您无法修改的常量变量。因此,您需要复制它并修改副本,而不是修改mall
。
var newMall = mall;
newMall.distance = distanceInMeters
但是,您还想丢弃原始副本并使用新副本。简单的方法是使用Array.map
创建一个包含新副本的新数组。
答案 1 :(得分:0)
假设您Mall
定义了类似的内容:
struct Mall {
var distance: String
var name: String
init...
...
...
}
您必须访问struct
的属性for mall in malls {
mall.distance = distanceInMeters
}
答案 2 :(得分:0)
由于Mall
是结构,然后是值类型,因此需要将更新后的值放回数组中,以便
for index in 0..<malls.count {
var mall = malls[index] // copy a mall value
mall.distance = "new value goes here" // change the copy of mall
malls[index] = mall // put the updated mall back into the array
}
答案 3 :(得分:0)
尽管存在拼写错误,但如果要创建只有两个参数的类型init(name: String, distance: String) {
self.name = name
self.distance = distance
}
,则需要在结构中创建一个init方法:
for (index, mall) in malls.enumerated() {
malls[index].distance = distanceInMeters
}
另外,如您所见,您无法编辑来自for循环的值。你可以做的是这样的事情:
mall
这样,您可以直接修改malls数组,而不是修改从for循环中获取的商城。
您甚至可以将_
替换为{{1}},因为在该示例中您不需要购物中心。
希望它有意义。