在 Swift 3 中沿字典迭代
Iterating along a Dictionary in Swift 3
我正在尝试遍历字典以删除未确认的条目。以下 Objective-C 代码的 Swift 3 翻译不起作用:
[[self sharingDictionary] enumerateKeysAndObjectsUsingBlock: ^(id key, id obj, BOOL *stop) {
SharingElement* element=[[self sharingDictionary] objectForKey:key];
if (!element.confirmed){
dispatch_async(dispatch_get_main_queue(), ^{
[element deleteMe];
});
[[self sharingDictionary] performSelector:@selector(removeObjectForKey:) withObject:key
afterDelay:.2];
} else{
element.confirmed=NO;
}];
所以我尝试以这种方式使用以下紧凑的 enumerated() 方法:
for (key, element) in self.sharingDictionary.enumerated(){
if (!element.confirmed){
element.deleteMe()
self.perform(#selector(self.removeSharingInArray(key:)), with:key, afterDelay:0.2);
} else{
element.confirmed=false
}
}
然而编译器在处理变量'element'的使用时报如下错误:
Value of tuple type '(key: Int, value: SharingElement)' has no member
'confirmed'
像'element'取了完整的元组父亲而不是其权限的一部分。
是在使用 enumerated() 还是在处理字典时出现问题,我该如何解决?
使用element.value.confirmed
。 element
是一个包含 key
和 value
的元组。
但您可能只想删除 enumerated()
:
for (key, element) in self.sharingDictionary {
...
}
enumerated()
进行迭代并添加从零开始的索引。这与字典一起使用并不常见。
我最终将其实现为:
DispatchQueue.global(attributes: .qosBackground).async{
for (key, element) in self.sharingDictionary{
if !element.confirmed{
DispatchQueue.main.async({
element.deleteMe()
self.removeSharingInArray(key:key)
})
} else{
element.confirmed=false
}
}
}
所以希望在浏览时删除对象而不更改字典,是什么让应用程序崩溃了,即使我不知道它是否仍然如此。
这应该可以解决问题,
localDictionary.enumerateKeysAndObjects ({ (key, value, stop) -> Void in
})
我正在尝试遍历字典以删除未确认的条目。以下 Objective-C 代码的 Swift 3 翻译不起作用:
[[self sharingDictionary] enumerateKeysAndObjectsUsingBlock: ^(id key, id obj, BOOL *stop) {
SharingElement* element=[[self sharingDictionary] objectForKey:key];
if (!element.confirmed){
dispatch_async(dispatch_get_main_queue(), ^{
[element deleteMe];
});
[[self sharingDictionary] performSelector:@selector(removeObjectForKey:) withObject:key
afterDelay:.2];
} else{
element.confirmed=NO;
}];
所以我尝试以这种方式使用以下紧凑的 enumerated() 方法:
for (key, element) in self.sharingDictionary.enumerated(){
if (!element.confirmed){
element.deleteMe()
self.perform(#selector(self.removeSharingInArray(key:)), with:key, afterDelay:0.2);
} else{
element.confirmed=false
}
}
然而编译器在处理变量'element'的使用时报如下错误:
Value of tuple type '(key: Int, value: SharingElement)' has no member 'confirmed'
像'element'取了完整的元组父亲而不是其权限的一部分。 是在使用 enumerated() 还是在处理字典时出现问题,我该如何解决?
使用element.value.confirmed
。 element
是一个包含 key
和 value
的元组。
但您可能只想删除 enumerated()
:
for (key, element) in self.sharingDictionary {
...
}
enumerated()
进行迭代并添加从零开始的索引。这与字典一起使用并不常见。
我最终将其实现为:
DispatchQueue.global(attributes: .qosBackground).async{
for (key, element) in self.sharingDictionary{
if !element.confirmed{
DispatchQueue.main.async({
element.deleteMe()
self.removeSharingInArray(key:key)
})
} else{
element.confirmed=false
}
}
}
所以希望在浏览时删除对象而不更改字典,是什么让应用程序崩溃了,即使我不知道它是否仍然如此。
这应该可以解决问题,
localDictionary.enumerateKeysAndObjects ({ (key, value, stop) -> Void in
})