首页 文章

使用Swift创建一个Dictionary作为可选属性

提问于
浏览
3

我创建了一个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 回答

  • 2

    其中一些问题是概念错误,其中一些与今天的Xcode 6 beta 5版本中发生变化的行为有关 . 贯穿他们所有:

    • 这行编译,但有一个多余的 !
    self.myThirdDictionary! = [String :String]()
    

    如果你提供新的内容,如果它的当前内容是 nil 则你不重要 . 相反,只需分配:

    self.myThirdDictionary = [String :String]()
    
    • 同样,此行失败,因为您在解包前进行了下标:
    self.myThirdDictionary["animal"]! = "Monkey"
    

    这是一个问题,因为如果 myThirdDictionary 尚未初始化,您可以订阅 nil . 相反,在检查/展开可选项后下标 . 从beta 5开始,您可以通过可选的check / unwrap使用变异运算符或方法,因此最简单,最安全的方法是:

    self.myThirdDictionary?["animal"] = "Monkey"
    

    如果 myThirdDictionarynil ,则此行无效 . 如果 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 导入未使用的空字典文字,而不是重复的类型信息)

相关问题