我创建了一个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":
-
在Dictionary初始化编译器中说: Could not find an overload for 'init' that accepts the supplied arguments
-
当我尝试在 addOneThingToThirdDictionary() 中添加键/值对时: '[String : String]?' does not have a member named 'subscript'
-
当我尝试在 addAnotherThingToThirdDictionary() 中添加键/值对时: Immutable value of type '[String : String]' only has mutating members named 'updateValue'
有什么想法吗 ?
1 回答
其中一些问题是概念错误,其中一些与今天的Xcode 6 beta 5版本中发生变化的行为有关 . 贯穿他们所有:
!
:如果你提供新的内容,如果它的当前内容是
nil
则你不重要 . 相反,只需分配:这是一个问题,因为如果
myThirdDictionary
尚未初始化,您可以订阅nil
. 相反,在检查/展开可选项后下标 . 从beta 5开始,您可以通过可选的check / unwrap使用变异运算符或方法,因此最简单,最安全的方法是:如果
myThirdDictionary
是nil
,则此行无效 . 如果myThirdDictionary
已初始化,则下标设置操作成功 .现在,它的工作原理 - 因为你可以改变强制解包的结果 . 但是,如果可选项是
nil
,则强制解包将崩溃 . 相反,最好使用可选链接运算符(同样,您现在可以变异):最后,由于类型和范围推断,此代码中有很多东西可以缩小 . 这里修复了所有问题并删除了多余的部分:
(更改:
Foundation
导入未使用的空字典文字,而不是重复的类型信息)