用索引集替换的扩展名

时间:2016-12-22 05:12:35

标签: ios arrays swift

我想为Array添加一个扩展名,用索引集替换元素:

extension Array {
    mutating func replace(newElements: [Element], at indexes: IndexSet) {
        //implementation here
    }
}

使用的一个例子:

var set: IndexSet = [2, 1]
var array = ["0", "1", "2", "3", "4"]
array.replace(newElements: ["@", "%"], at: set) // custom method from future extension
print(array) //Prints ["0", "%", "@", "3", "4"]

但我无法通过索引从IndexSet获取元素。我怎么能这样做?或者您可能知道更换阵列中元素的更优雅的解决方案。我正在使用IndexSet而不是Array<Int>,因为稍后我会将其用于替换UITableView中的部分。

2 个答案:

答案 0 :(得分:1)

使用[Int]代替IndexSet没有任何问题,当你使用它时,你必须使用像indexes.index(indexes.startIndex, offsetBy: 1)这样的方法来访问索引,非常烦人,我建议只使用{ {1}}和其他数组函数一样,当值超出范围时抛出错误

答案 1 :(得分:0)

正如@Alexander上面提到的那样,使用IndexSet没有任何意义,因为这不是有序的。你可能想要的是每个索引的Int个数组。那会让你有这样的事情:

extension Array {
    mutating func replace(newElements: [Element], at indexes: [Int]) {
        for (index, position) in indexes.enumerated() {
            guard position < count else {
                // error handling
                return
            }

            remove(at: position)
            insert(newElements[index], at: position)
        }
    }
}