Я пытаюсь упростить Parcelable код в Котлин:Kotlin: назначается «это»?
public class C() : Parcelable {
var b1: Boolean = false
var b2: Boolean = false
var b3: Boolean = false
var i1: Int = 0
var i2: Int = 0
val parcelBooleans = listOf(b1, b2, b3)
val parcelInts = listOf(i1, i2)
override fun writeToParcel(p: Parcel, flags: Int) {
parcelBooleans.forEach { p.writeBoolean(it) }
parcelInts.forEach { p.writeInt(it) }
}
private fun readFromParcel(p: Parcel) {
parcelBooleans.forEach{ it = p.readBoolean() } // does not compile as "it" is a "val"
}
// ... parcel creator bla bla
}
writeBoolean() и readBoolean() являются функциями расширения.
Есть ли способ иметь forEach в списке с назначаемым «it»?
Update:в комментарии к одному из ответов автор разъясняет этот вопрос как:
Я считаю, что мой список не является изменяемым, элементы внутри есть. Элементы - это мои свойства. Но я понимаю, что, возможно, listOf делает копию значений моих свойств ... так что либо я должен полагаться на отражение, либо обернуть базовый тип в класс, чтобы позволить изменять их значение.
Намерение осуществляется через список только для чтения parcelBooleans
который содержит ссылки на b1
, b2
и b3
изменять значения b1
, b2
и b3
; но не мутирует сам список.
Привет. Попробуйте это: http://stackoverflow.com/questions/5849154/can-we-write-our-own-iterator-in-java (реализовать свой собственный итератор: http://docs.oracle.com/javase/6/ docs/api/java/util/Iterator.html) – Totoo
Вы можете создать свой собственный Iterator в качестве метода расширения для списка <>, например forMutableEach {} – D3xter
Это было бы лучше, если бы вы написали вопрос как единичный тест с утверждениями, поэтому цель понятна. Вы пытаетесь обновить 'b1',' b2', 'b3' через свои ссылки в списке? Или вы просто пытаетесь обновить значения списка в 'parcelBooleans' до новых значений. Если первый, то ответ от Башора. Если второй, то ответ от меня. Вы должны обновить свой вопрос, чтобы быть понятным (я думаю, что чтение каждого комментария ниже помогает, но это не очень удобно) –