删除数组内部的项目,该数组是字典Swift 2中的值

时间:2016-06-09 17:17:35

标签: swift2 xcode7

我知道之前可能已经回答了,但是当我搜索时我找不到任何东西。

所以我的字典看起来像这样:

var dict = [String:[String]]()

我想要做的是删除数组内部的某个索引(字典的值)。假设我想从此代码中删除字符串“Chair”:

dict = ["Furniture": ["Table", "Chair", "Bed"], "Food": ["Pancakes"]]

如果已经回答,请再次抱歉。

3 个答案:

答案 0 :(得分:1)

许多涵盖字典条目变异的答案往往侧重于 删除值 - >变异值 - >替换值成语,但请注意删除不是必需的。您同样可以使用例如执行就地突变。可选链接

dict["Furniture"]?.removeAtIndex(1)

print(dict)
    /* ["Furniture": ["Table", "Bed"], 
        "Food": ["Pancakes"]]          */

但请注意,使用.removeAtIndex(...)解决方案并不完全安全,除非您执行数组边界检查,确保我们尝试删除元素的索引实际存在。

作为一种安全的就地变异替代方法,使用可选绑定语句的where子句来检查我们要删除的索引是否超出范围

let removeElementAtIndex = 1
if let idxs = dict["Furniture"]?.indices where removeElementAtIndex < idxs.endIndex {
    dict["Furniture"]?.removeAtIndex(removeElementAtIndex)
}

另一种安全的替代方法是利用advancedBy(_:limit)获取在removeAtIndex(...)中使用的安全索引。

let removeElementAtIndex = 1
if let idxs = dict["Furniture"]?.indices {
    dict["Furniture"]?.removeAtIndex(
        idxs.startIndex.advancedBy(removeElementAtIndex, limit: idxs.endIndex))
}  

最后,如果使用 remove / mutate / replace 习语,另一个安全的替代方法是使用flatMap进行变异步骤,删除给定索引的元素,如果该索引存在在数组中。例如,对于通用方法(以及where条款滥用:)

func removeSubArrayElementInDict<T: Hashable, U>(inout dict: [T:[U]], forKey: T, atIndex: Int) {
    guard let value: [U] = dict[forKey] where
        { () -> Bool in dict[forKey] = value
            .enumerate().flatMap{ $0 != atIndex ? $1 : nil }
            return true }()
        else { print("Invalid key"); return }
}

/* Example usage */
var dict = [String:[String]]()
dict = ["Furniture": ["Table", "Chair", "Bed"], "Food": ["Pancakes"]]

removeSubArrayElementInDict(&dict, forKey: "Furniture", atIndex: 1)

print(dict)
    /* ["Furniture": ["Table", "Bed"], 
        "Food": ["Pancakes"]]          */

答案 1 :(得分:1)

如果要删除特定的元素,可以执行以下操作:

var dict = ["Furniture": ["Table", "Chair", "Bed"], "Food": ["Pancakes"]]

extension Array where Element: Equatable {
    mutating func removeElement(element: Element) {
        if let index = indexOf ({ $0 == element }) {
            removeAtIndex(index)
        }
    }
}

dict["Furniture"]?.removeElement("Chair") //["Furniture": ["Table", "Bed"], "Food": ["Pancakes"]]

答案 2 :(得分:0)

guard var furniture = dict["Furniture"] else {
    //oh shit, there was no "Furniture" key
}
furniture.removeAtIndex(1)
dict["Furniture"] = furniture