Ram*_*sel 8 objective-c nsdictionary ios
我一直试图将两个NSDictionaries合并几个小时.搜索并发现我可以使用[NSMutableDictionary addEntriesFromDictionary:].
NSDictionary *areaAttributes = [[area entity] attributesByName];
NSDictionary *gpsAttributes = [[gps entity] attributesByName];
NSMutableDictionary *areaAttributesM = [areaAttributes mutableCopy];
NSMutableDictionary *gpsAttributesM = [gpsAttributes mutableCopy];
NSMutableDictionary *combinedAttributes = [areaAttributesM addEntriesFromDictionary:gpsAttributesM];
Run Code Online (Sandbox Code Playgroud)
但我得到错误:
Initializing 'NSMutableDictionary *_strong' with an expression of incompatible type 'void'
Run Code Online (Sandbox Code Playgroud)
所以这就是[areaAttributesM addEntriesFromDictionary:gpsAttributesM]回报void?我的理解是否正确?为什么它回归无效?
aba*_*ert 13
是的,你是对的.来自文档:
- (void)addEntriesFromDictionary:(NSDictionary *)otherDictionary
Run Code Online (Sandbox Code Playgroud)
至于为什么,这很简单:在Cocoa中改变对象的函数通常返回void,因此您可以轻松地将它们与返回不同对象的函数区分开来.
此外,还有没有理由mutableCopy的gpsAttributes字典; 它只是被用作参数-[addEntriesFromDictionary:],它不需要是可变的.
所以,正确的方法是:
NSDictionary *areaAttributes = [[area entity] attributesByName];
NSDictionary *gpsAttributes = [[gps entity] attributesByName];
NSMutableDictionary *combinedAttributes = [areaAttributes mutableCopy];
[combinedAttributes addEntriesFromDictionary:gpsAttributes];
Run Code Online (Sandbox Code Playgroud)
NSDictionary如果您经常这样做,您可能希望将其包装在函数(或类别中的方法)中:
NSDictionary *mergeDictionaries(NSDictionary *lhs, NSDictionary *rhs) {
NSMutableDictionary *ret = [lhs mutableCopy];
[ret addEntriesFromDictionary:rhs];
return ret;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8187 次 |
| 最近记录: |