ios - 使用 Swift 创建一个字典作为可选属性

标签 ios xcode swift

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

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

关于ios - 使用 Swift 创建一个字典作为可选属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25126929/

相关文章:

ios - 更改 UISlider 轨道图像的 alpha?

ios - 将数据转换为 bool 值

xcode - 如何禁用导航 Controller (Swift)内特定 View Controller 的自动旋转?

ios - Nib 原型(prototype) uitableviewcell cellForRowAtIndexPath :

iphone - 内存泄漏removeItemAtPath :error:?

macos - 为什么 NSSpeechSynthesizer 在 OS X 上输出空文件? ( swift 2)

ios - 在 Swift 3 中的文本中的某个字符串之前放置一个字符串

ios - 架构 i386 iOS 的 undefined symbol

ios - 无法设置引用 socket

ios - Xcode 9-无法发出预编译的 header