mea*_*ers 18 arrays foreach swift
protocols.forEach { $0.prop = nil }
Run Code Online (Sandbox Code Playgroud)
结果是:
Cannot assign to property: '$0' is immutable
Run Code Online (Sandbox Code Playgroud)
我解决了这个问题:
protocols.forEach
{
var protocol = $0
protocol.prop = nil
}
Run Code Online (Sandbox Code Playgroud)
但是为什么编译器可以用这个呢?我希望它可以解决这个问题.
vac*_*ama 35
您有一组实现协议的项目.如果你不告诉Swift这是一个class协议,它将假设它可以由a实现struct.
在forEach循环中,您将基本上有一个let变量($0默认情况下调用)依次分配给数组中的每个值.如果您有一个对象数组(类的实例),则可以修改该项的属性.如果你有一个struct项目数组,那么这些项目将是不可变的.如果您有一组实现协议的项目,那么struct除非您添加: class到协议定义中,否则Swift会将它们视为更具限制性.
例如:
protocol Xyzzy: class {
var prop: Int? { get set }
}
class Fred: Xyzzy, CustomStringConvertible {
var description: String { return "\(prop)" }
var prop: Int? = 17
}
let objects: [Xyzzy] = [Fred(), Fred(), Fred()]
print(objects) // [Optional(17), Optional(17), Optional(17)]
objects.forEach { $0.prop = nil }
print(objects) // [nil, nil, nil]
Run Code Online (Sandbox Code Playgroud)
你的解决方法:
protocols.forEach
{
var protocol = $0
protocol.prop = nil
}
Run Code Online (Sandbox Code Playgroud)
适用于类对象,因为它创建了一个var指向该对象的新指针,然后允许您修改该对象.请注意,此解决方法仅适用于类的实例.如果您的协议是由a实现的struct,那么new var将是该项的新副本struct,并且不会更改数组中的原始副本.
Den*_*kin 11
如何改变Array的Structs
对于每个元素:
itemsArray.indices.forEach { itemsArray[$0].someValue = newValue }
Run Code Online (Sandbox Code Playgroud)
对于特定元素:
itemsArray.indices.filter { itemsArray[$0].propertyToCompare == true }
.forEach { itemsArray[$0].someValue = newValue }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5338 次 |
| 最近记录: |