我创建了一个 swift 类来测试字典。所以,我写了下面的代码:
import Foundation
class MyClass {
var myFirstDictionary:[String :String]
var myThirdDictionary:[String :String]?
init(){
var mySecondDictionary:[String :String] = [String :String]()
mySecondDictionary["animal"] = "Monkey"
mySecondDictionary.updateValue("something", forKey: "SomeKey")
self.myFirstDictionary = [String :String]()
addOneThingToSecondDictionary()
addAnotherThingToSecondDictionary()
self.myThirdDictionary! = [String :String]()
addOneThingToThirdDictionary()
addAnotherThingToThirdDictionary()
}
func addOneThingToSecondDictionary(){
self.myFirstDictionary["animal"] = "Monkey"
}
func addAnotherThingToSecondDictionary(){
self.myFirstDictionary.updateValue("Superman", forKey: "hero")
}
func addOneThingToThirdDictionary(){
self.myThirdDictionary["animal"]! = "Monkey"
}
func addAnotherThingToThirdDictionary(){
self.myThirdDictionary!.updateValue("Superman", forKey: "hero")
}
}
所以,我遇到了 3 个关于 “myThirdDictionary” 的错误:
- 在字典初始化编译器中说:找不到接受所提供参数的“init”的重载
- 当我尝试在 addOneThingToThirdDictionary() 中添加键/值对时:'[String : String]?'没有名为“下标”的成员
- 当我尝试在 addAnotherThingToThirdDictionary() 中添加键/值对时:“[String : String]”类型的不可变值只有名为“updateValue”的可变成员
有什么想法吗?
最佳答案
其中一些问题是概念错误,其中一些与今天的 Xcode 6 beta 5 版本中更改的行为有关。遍历它们:
这一行可以编译,但是有一个多余的
!
:self.myThirdDictionary! = [String :String]()
您不需要解包一个可选项来分配给它——如果您提供新内容,它的当前内容是否为
nil
并不重要。相反,只需分配:self.myThirdDictionary = [String :String]()
同样,此行失败是因为您在解包之前进行了下标:
self.myThirdDictionary["animal"]! = "Monkey"
这是一个问题,因为如果
myThirdDictionary
尚未初始化,您可能会下标nil
。相反,在检查/展开可选之后下标。从 beta 5 开始,您可以通过可选的检查/展开来使用可变运算符或方法,因此最短且最安全的方法是:self.myThirdDictionary?["animal"] = "Monkey"
如果
myThirdDictionary
为nil
,则此行无效。如果myThirdDictionary
已经初始化,则下标集操作成功。此行在以前的测试版中失败,因为强制展开产生了一个不可变值:
self.myThirdDictionary!.updateValue("Superman", forKey: "hero")
现在,它在某种程度上起作用了,因为您可以改变强制解包的结果。但是,如果可选项为
nil
,则强制解包将崩溃。相反,最好使用可选链运算符(同样,您现在可以通过它进行变异):self.myThirdDictionary?.updateValue("Superman", forKey: "hero")
最后,由于类型和范围推断,您可以在这段代码中精简很多东西。这是所有已修复的问题和删除的多余位:
class MyClass {
var myFirstDictionary: [String: String]
var myThirdDictionary: [String: String]?
init(){
var mySecondDictionary: [String: String] = [:]
mySecondDictionary["animal"] = "Monkey"
mySecondDictionary.updateValue("something", forKey: "SomeKey")
myFirstDictionary = [:]
addOneThingToSecondDictionary()
addAnotherThingToSecondDictionary()
// uncomment to see what happens when nil
myThirdDictionary = [:]
addOneThingToThirdDictionary()
addAnotherThingToThirdDictionary()
}
func addOneThingToSecondDictionary(){
myFirstDictionary["animal"] = "Monkey"
}
func addAnotherThingToSecondDictionary(){
myFirstDictionary.updateValue("Superman", forKey: "hero")
}
func addOneThingToThirdDictionary(){
myThirdDictionary?["animal"] = "Monkey"
}
func addAnotherThingToThirdDictionary(){
myThirdDictionary?.updateValue("Superman", forKey: "hero")
}
}
(更改:Foundation
导入未使用的空字典文字而不是重复的类型信息)
关于ios - 使用 Swift 创建一个字典作为可选属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25126929/