2016-12-15 56 views
0

考虑:如何在Swift 3中添加新的var到结构数组?

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

由于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 
} 
+0

但知道我不能malls.distance商场排序:( – dmarinkin

+0

@dmarinkin:你的问题不是排序你问到如何将新值分配到商场值的属性。 –

0

假设你有Mall定义是这样的:

struct Mall { 
    var distance: String 
    var name: String 

    init... 
    ... 
    ... 
} 

您有权访问属性的结构的

for mall in malls { 
    mall.distance = distanceInMeters 
} 
+0

感谢您的答复,但它sdoesn't工作( '结构商城{ 让名:字符串 让距离:字符串 }' – dmarinkin

+0

你能你的结构定义添加到您的问题,您可能只需要改变你的'let'到'var' – Frankie

+0

@dmarinkin'distance'需要声明与'var'一个变量,而不是'let'(恒定),如果你希望能够初始化 – Alexander

1

因为结构是值类型,而不是引用类型,修改副本不会反映更改到副本。并且默认情况下,for循环会为您提供let常量,这是不可变的。所以你不能修改它。

你应该这样做:

malls = malls.map { mall in 
    var newMall = mall 
    newMall.distance = distanceInMeters 
    return newMall 
} 

你所得到的错误是

Cannot assign to property: 'mall' is a 'let' constant

这意味着mall是一个常数变量,不能修改。因此,而不是修改mall,您需要复制它并修改副本。

var newMall = mall; 
newMall.distance = distanceInMeters 

但是,您还想丢弃原始副本并使用新副本。简单的方法是使用Array.map创建一个具有新副本的新阵列。

+0

后的所有信息,以及如何根据距离知道?谢谢! – dmarinkin

0

尽管错别字,如果你想创建一个类型Mall只用两个参数你需要在你的结构来创建一个init方法:

init(name: String, distance: String) { 
     self.name = name 
     self.distance = distance 
    } 

而且,正如你所看到的,你不能编辑从未来的for循环的值。但是什么你能做的就是这样的事情:

for (index, mall) in malls.enumerated() { 
    malls[index].distance = distanceInMeters 
} 

这样,而不是通过修改商场你从for循环你,而不是直接修改商场阵列获得。

你甚至可以通过_取代mall因为你不需要在这个例子商场。 希望它是有道理的。 !

相关问题