錯誤 -[__NSCFString countByEnumeratingWithState:objects:count:]: unrecognized selector 表示嘗試用 for-in 遍歷非集合物件(此處為 NSString)。原始碼 for (NSArray *a in dict) 實際遍歷的是字典的鍵(通常為 NSString),而非值(NSArray)。
NSDictionary *dict = @{@"key1": @[@"a", @"b"], @"key2": @[@"c"]};
for (NSArray *a in dict) { // a 實際是 NSString (key)
for (NSString *s in a) { // 嘗試遍歷 NSString → 崩潰
}
}
for (NSArray *array in [dict allValues]) {
for (NSString *str in array) {
NSLog(@"%@", str);
}
}
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
NSArray *array = (NSArray *)obj;
for (NSString *str in array) {
NSLog(@"Key: %@, Value: %@", key, str);
}
}];
NSArray *allStrings = [dict.allValues valueForKeyPath:@"@unionOfArrays.self"];
for (NSString *str in allStrings) {
NSLog(@"%@", str);
}
支援 for-in 的類別必須實作 NSFastEnumeration:
// 印出實際類型確認
for (id obj in dict) {
NSLog(@"Type: %@, Class: %@", obj, [obj class]);
// 輸出: Type: key1, Class: __NSCFString
}
let dict: [String: [String]] = ["key1": ["a", "b"], "key2": ["c"]]
// 遍歷值
for array in dict.values {
for str in array {
print(str)
}
}
// 同時取得鍵值
for (key, array) in dict {
for str in array {
print("Key: \(key), Value: \(str)")
}
}
// 扁平化
let allStrings = dict.values.flatMap { $0 }
理解字典遍歷預設產出鍵而非值,並確認物件是否符合 NSFastEnumeration,即可避免此類崩潰。