如何在Swift 3中为结构数组添加新的var?

时间:2016-12-15 00:29:20

标签: arrays swift

假设:

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
     }

4 个答案:

答案 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}},因为在该示例中您不需要购物中心。 希望它有意义。