Swift - 编辑struct

时间:2015-09-17 08:22:54

标签: ios swift

假设我们有一个结构

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"
}    

有更好的方法吗?

2 个答案:

答案 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"}] 只读取了只有获取的属性,如下图所示:

enter image description here

只返回数组中的最后一个元素,如果不存在,则返回items.last!.text = "dd"。所以你不能给它分配任何值。