我知道之前可能已经回答了,但是当我搜索时我找不到任何东西。
所以我的字典看起来像这样:
var dict = [String:[String]]()
我想要做的是删除数组内部的某个索引(字典的值)。假设我想从此代码中删除字符串“Chair”:
dict = ["Furniture": ["Table", "Chair", "Bed"], "Food": ["Pancakes"]]
如果已经回答,请再次抱歉。
答案 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