我有一系列结构:
struct CalendarDate {
var date: NSDate?
var selected = false
}
private var collectionData = [CalendarDate]()
Run Code Online (Sandbox Code Playgroud)
我简单地填写这样的日期:
for _ in 1...7 {
collectionData.append(CalendarDate(date: NSDate(), selected: false))
}
Run Code Online (Sandbox Code Playgroud)
因此,当您点击collectionView时,我只想循环遍历数据并将它们全部标记为False.
for c in collectionData {
c.selected = false ///ERROR: Cannot assign to 'selected' in 'c'
}
Run Code Online (Sandbox Code Playgroud)
为什么我会收到此错误?
如果我这样做,它工作正常,但我想知道我上面做错了什么:
for i in 0..<collectionData.count {
collectionData[i].selected = false
}
Run Code Online (Sandbox Code Playgroud)
Gri*_*mxn 25
据我所知,迭代器
for c in collectionData
返回项目的副本collectionData- (structs是值类型,不是引用类型,请参阅http://www.objc.io/issue-16/swift-classes-vs-structs.html),而迭代
for i in 0..<collectionData.count
访问实际值.如果我是正确的,那么c从迭代器中返回指定它是没有意义的......它不会"指向"原始值,而
collectionData[i].selected = false
在迭代中是原始值.
一些其他评论员建议
for (var c) in collectionData
但是虽然这允许你分配c,它仍然是一个副本,而不是指向原始的指针,虽然你可以修改c,但collectionData仍然保持不变.
答案是:A)使用最初记录的迭代或B)将数据类型更改为类,而不是结构.
因为默认情况下每个'c'都是let,这是CalendarDate的一个新实例,并且索引处的数组值为for的每一步复制到此,'c'不是指向数组索引的指针只是索引的副本,因此如果为此设置新值,则新值不适用于数组.但'i'用作数组的索引,可以直接操作数组的值.
| 归档时间: |
|
| 查看次数: |
2595 次 |
| 最近记录: |