Ios 错误无法为类型为';的值下标;字典<;NSObject,AnyObject>';索引类型为';字符串';
有人能帮我吗?我刚刚将我的小项目从Objective-C重新编程到Swift,出现以下错误: 无法使用“String”类型的索引为“Dictionary”类型的值下标Ios 错误无法为类型为';的值下标;字典<;NSObject,AnyObject>';索引类型为';字符串';,ios,objective-c,swift,plist,Ios,Objective C,Swift,Plist,有人能帮我吗?我刚刚将我的小项目从Objective-C重新编程到Swift,出现以下错误: 无法使用“String”类型的索引为“Dictionary”类型的值下标 eins、zwei、drei和vier是从另一个视图控制器获取数据的字符串 目标C代码: @property (strong, nonatomic) IBOutlet UISwitch *bluetoothSwitch; - (void)viewDidLoad { [super viewDidLoad]; NS
eins
、zwei
、drei
和vier
是从另一个视图控制器获取数据的字符串
目标C代码:
@property (strong, nonatomic) IBOutlet UISwitch *bluetoothSwitch;
- (void)viewDidLoad
{
[super viewDidLoad];
NSString *SwitchState;
NSArray *myStrings = [[NSArray alloc] initWithObjects:eins,zwei,drei, vier, nil];
SwitchState = [myStrings componentsJoinedByString:mad:" | | "];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:mad:"store.plist"];
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath: path]) {
path = [documentsDirectory stringByAppendingPathComponent: [NSString stringWithFormat:mad:"store.plist"] ];
}
NSMutableDictionary *savedValue = [[NSMutableDictionary alloc] initWithContentsOfFile: path];
if ([[savedValue objectForKey:SwitchState] boolValue]) {
self.bluetoothSwitch.on = [[savedValue objectForKey:SwitchState] boolValue];
} else {
}
}
我的Swift代码:
var eins = "Test"
var zwei = "Text"
var drei = "Test"
var vier = "Text"
var SwitchState = ""
let myStrings = [eins, zwei, drei, vier]
SwitchState = myStrings.joined(separator: " | | ")
let paths = NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true)
let documentsDirectory = paths[0]
var path = URL(fileURLWithPath: documentsDirectory).appendingPathComponent("store.plist").absoluteString
let fileManager = FileManager.default
if !fileManager.fileExists(atPath: path) {
path = URL(fileURLWithPath: documentsDirectory).appendingPathComponent("store.plist").absoluteString
}
var savedValue = NSDictionary(contentsOfFile: path) as Dictionary?
print("Das bekommt viewdid: \(SwitchState)")
if (savedValue?[SwitchState] as? NSNumber)?.boolValue ?? false {
bluetoothSwitch.isOn = (savedValue?[SwitchState] as? NSNumber)?.boolValue ?? false
} else {
print("nein")
}
这两行“产生”了错误
if (savedValue?[SwitchState] as? NSNumber)?.boolValue ?? false {
bluetoothSwitch.isOn = (savedValue?[SwitchState] as? NSNumber)?.boolValue ?? false
请不要试图将Objective-C代码逐字翻译成Swift。从Swift的角度来看,有很多很多不好的做法 如果有本机对应的类,基本上不要在Swift中使用
NS…
类
发生此错误的原因是,从NSDictionary
转换到Dictionary
(未指定Swift类型)的桥接结果是Dictionary
,它与值类型字符串
不兼容
这是一个真正的Swift版本:
let eins = "Test"
let zwei = "Text"
let drei = "Test"
let vier = "Text"
let myStrings = [eins, zwei, drei, vier]
let switchState = myStrings.joined(separator: " | | ")
let fileManager = FileManager.default
do {
let applicationSupportDirectory = try fileManager.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
let storeURL = applicationSupportDirectory.appendingPathComponent("store.plist")
let data = try Data(contentsOf: storeURL)
print("Das bekommt viewdid: \(switchState)")
if let savedDictionary = try PropertyListSerialization.propertyList(from: data, format: nil) as? [String:Any],
let savedState = savedDictionary[switchState] as? Bool {
bluetoothSwitch.isOn = savedState
} else {
bluetoothSwitch.isOn = false
print("nein")
}
} catch { print(error) }
文件存在(atPath
检查是多余的,所以我忽略了它。到底是哪一行导致了错误?我更新了帖子