Swift iOS NSDictionary setValue 崩溃 - 但为啥?

Posted

技术标签:

【中文标题】Swift iOS NSDictionary setValue 崩溃 - 但为啥?【英文标题】:Swift iOS NSDictionary setValue crash - but why?Swift iOS NSDictionary setValue 崩溃 - 但为什么? 【发布时间】:2016-01-28 15:04:52 【问题描述】:

我有这个代码(从另一种语言移植,因此命名约定有点不同,但请暂时忍耐一下)

var FDefaultsList: NSDictionary = [String:String]();
let TmpKey: String = TmpKeyValue[0];
let TmpValue: String = TmpKeyValue[1];    
if (TmpKey != "") && (TmpValue != "") 
  //let TmpAnyObjectValue: AnyObject? = TmpValue;
  //FDefaultsList.setValue(TmpAnyObjectValue, forKey: TmpKey);
  FDefaultsList.setValue(TmpValue, forKey: TmpKey);

但是,无论我使用哪种 setValue 变体,对 setValue 的调用都会引发错误(据我所知没有意义)并退出应用程序(Xcode 编辑器被带到 class AppDelegate: UIResponder, UIApplicationDelegate)

我猜我使用 NSDictionary 错了?我正在尝试读取一个文本文件,其中每一行都是 key=value 字符串

【问题讨论】:

使用 FDefaultsList[TmpValue] = TmpKey & 只使用来自 swift 的 Dictionary 而不是 NSDictionary。 您应该包含错误消息,即使它对您毫无意义。使用setObject 而不是setValue,如果你想编辑它应该是NSMutableDictionary 我想要一个(可变)字典,我可以在其中读/写字符串键/值。我将尝试阅读可可/obj-c 字典(?)与 swift 字典的优缺点。 @Tom swift Dictionary 是可变的,你只需要将其定义为var 而不是let 基本上不要使用setValue:forKey:,除非你真的需要KVC。要为key 设置value,请始终使用setObject:forKey: 或键下标。 【参考方案1】:

您应该声明一个实际的 NSMutableDictionary 而不是强制转换为 NSDictionary。

您可以使用比setValue 更简单的下标(实际上应该是setObject):

var FDefaultsList = NSMutableDictionary()
let TmpKey: String = "a"
let TmpValue: String = "b"
if TmpKey != "" && TmpValue != "" 
    FDefaultsList[TmpValue] = TmpKey

更“Swifty”的版本可能是:

var defaultsList = [String:String]()
let tmpKey = "a"
let tmpValue = "b"
if !tmpKey.isEmpty && !tmpValue.isEmpty 
    defaultsList[tmpValue] = tmpKey

【讨论】:

感谢您的回答。现在工作:)

以上是关于Swift iOS NSDictionary setValue 崩溃 - 但为啥?的主要内容,如果未能解决你的问题,请参考以下文章

NSDictionary, (key:AnyObject, value:AnyObject) 没有成员名下标

Swift:解析 JSON,NSDictionary 的 NSDictionary

将 NSDictionary 转换为 Swift 字典

使用 Swift 查询 iOS 钥匙串

如何使用 Swift、iOS 7 设置 rootViewController

Swift - 如何遍历 NSDictionary