假设我们有一个结构
struct Item {
var text: String
}
及其数组
var items: [Item] = [Item(text:"aa"), Item(text:"bb"), Item(text:"cc")]
我们想要更新该数组最后一项的文本。我的第一个版本看起来像这样:
if var item = self.items.last {
item.text = "dd"
}
但是因为它是struct,所以复制了该项并且不修改该数组。第一个解决方案是将struct更改为class,但我认为这不是一个好的解决方案,也不是我的最终方法
if self.items.last != nil {
self.items[self.items.count - 1].text = "dd"
}
有更好的方法吗?
答案 0 :(得分:0)
你在这里做的事情应该像魅力一样:
Observable<String> source = Observable.from(
"A1", "A2", "A3", "B1", "B2", "B3", "C1", "D1");
Observable<List<String>> output = Observable.defer(() -> {
List<String> buffer = new ArrayList<>();
return
Observable.concat(
source.concatMap(new Function<String, Observable<List<String>>>() {
String lastKey;
@Override
public Observable<List<String>> apply(String t) {
String key = t.substring(0, 1);
if (lastKey != null && !key.equals(lastKey)) {
List<String> b = new ArrayList<>(buffer);
buffer.clear();
buffer.add(t);
lastKey = key;
return Observable.just(b);
}
lastKey = key;
buffer.add(t);
return Observable.empty();
}
}),
Observable.just(1)
.flatMap(v -> {
if (buffer.isEmpty()) {
return Observable.empty();
}
return Observable.just(buffer);
})
);
}
);
output.subscribe(System.out::println);
答案 1 :(得分:0)
以下是编辑struct数组最后一项的方法。
static void Main(string[] args)
{
int five = 5;
int sum = 0;
for (int i = 0; i < 1000; i++)
{
if (i % five == 0)
{
Console.WriteLine(i);
}
}
}
用操场测试。
如果您想使用if self.items.last != nil {
self.items[self.items.count - 1].text = "dd"
}
进行此操作,则无法进行此操作,因为struct Item {
var text: String
}
var items: [Item] = [Item(text:"aa"), Item(text:"bb"), Item(text:"cc")] //[{text "aa"}, {text "bb"}, {text "cc"}]
if items.last != nil {
items[items.count - 1].text = "dd"
}
items //[{text "aa"}, {text "bb"}, {text "dd"}]
只读取了只有获取的属性,如下图所示:
只返回数组中的最后一个元素,如果不存在,则返回items.last!.text = "dd"
。所以你不能给它分配任何值。