2016-06-09 44 views
1

我知道这可能已经回答过,但是当我搜索时我找不到任何东西。删除作为字典中值的数组内部的项Swift 2

所以我有一个字典,看起来像这样:

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

我想要做的是删除阵列(字典的值)的内部的某一指数。假设我想从此代码中删除字符串“Chair”:

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

对不起,如果这已经被回答。

覆盖字典条目的突变

回答

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

最后,如果使用删除/转变/替换成语,另一个安全的替代是使用flatMap为突变步骤,对于给定的索引中删除的元素,如果阵列中存在的索引。例如,对于一个通用的方法(和where条款滥用:)

​​
+0

正是我需要的。谢谢! –

+0

@MarkusJohansson乐意帮忙。 – dfri

0
guard var furniture = dict["Furniture"] else { 
    //oh shit, there was no "Furniture" key 
} 
furniture.removeAtIndex(1) 
dict["Furniture"] = furniture 
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"]] 
相关问题