【问题标题】:Create a Dictionary as a optional property using Swift使用 Swift 创建字典作为可选属性
【发布时间】:2014-08-04 20:22:54
【问题描述】:

我创建了一个 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”的变异成员

有什么想法吗?

【问题讨论】:

标签: ios xcode swift


【解决方案1】:

其中一些问题是概念上的错误,其中一些与今天的 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"
    

    如果myThirdDictionarynil,则此行无效。如果myThirdDictionary已经初始化,则下标设置操作成功。

  • 这行在之前的 beta 版本中失败了,因为强制展开产生了一个不可变的值:

    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 导入未使用的空字典文字而不是重复的类型信息)

【讨论】:

  • 这很有启发性!谢谢rickster!
【解决方案2】:

简单但有效

let like = (dic.value(forKey: "likes") as? NSDictionary)
print(like?.count)

或者,如果您想获得完整的字典计数,请使用:

 if let mainDic = dic as? NSDictionary{ 
    print(mainDic.count) 
    //add your code
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 2013-01-27
    • 2016-05-14
    • 1970-01-01
    • 2014-08-31
    • 2012-09-20
    相关资源
    最近更新 更多