当前位置: 首页 > 面试题库 >

Swift:非nil可选值引发nil异常

索嘉石
2023-03-14
问题内容

我有一本有值的字典,我叫它来填充一个字段

  if let userdata: NSDictionary = self.fbdata {
    println(userdata["email"]) // print Optional(email@domain.com)
    vc.email.text = userdata["email"] as? String ?? "" // raise a nil error
  }

如代码中所示,userdata [“
email”]存在并有一个值,由println打印,无论如何,在下一行中,我引发了一个nil可选异常(甚至不使用默认的“”值)

我看不到我在做什么错


问题答案:

它是文本字段的出口,但在prepareForSegue函数中似乎没有解包

那句话暴露出你的误解。事情按顺序发生,我在这里讨论:https
:
//stackoverflow.com/a/29552710/341994

因此,根据设计,prepareForSegue发生
新的视图控制器具有其视图或其出口之前。相反,连接插座的第一时间就是它自己的时间viewDidLoad,这是稍后的时间。

但是,您真正的错误更深。一个视图控制器 没有业务 设置,也 没有
与另一视图控制器的插座通信,因此无法操纵其界面。而是进行设置,以便目标视图控制器具有可以设置的普通 属性
。在中viewDidLoad,该视图控制器将检查该属性,检索值并通过其出口设置其 自己的 接口。

因此,总结一下:prepareForSegue是您初始化新视图控制器的机会。但是,仅此而已。然后,新的视图控制器将稍后控制其自己的视图-
顾名思义!它将在其自身viewDidLoad和以后开始。



 类似资料:
  • 问题内容: 我正在使用Xcode 6 Beta4。我有这种奇怪的情况,我无法弄清楚如何适当地测试可选项。 如果我有可选的xyz,则是正确的测试方法: 要么 这些文档说是第一种方法,但是我发现有时第二种方法是必需的,并且不会生成编译器错误,但是有时,第二种方法会生成编译器错误。 我的具体示例是使用桥接到swift的GData XML解析器: 在这里,如果我刚做过: 它将始终返回true。但是,如果我

  • 问题内容: Swift中的函数是否可以具有参数?我正在尝试这样做: …但是当我尝试调用它并通过时,它给了我一个奇怪的编译错误: 我不明白为什么我的类已经被声明为可选的,所以必须遵循某些特殊的协议。 问题答案: 它不会编译,因为该函数需要引用,但是您通过了。这个问题与可选无关。 通过用声明参数意味着您将在函数体内为其分配一些值。如何分配价值? 你需要这样称呼它 如果您了解C ,则这是代码的C 版本,

  • 问题内容: 这是Swift中的有效代码: 同样,输出将为真 将为假(数字1是任意的,您可以对-1进行相同的操作,可能还可以进行其他操作)。我问的原因是因为我看到一些试图将其与数字值进行比较的代码并将其编译,考虑return 似乎是错误的。 我的问题是,在Swift中这应该是有效的语法吗? 如果是这样,nil的数值是多少? Swift 3.0更新: 看起来Swift Evolution通过删除可选的

  • 问题内容: 我有下面的这段代码,它在调用keyboardWillShowNotification时运行: 我在第二行看到一条错误消息:。基本上,每当我单击textFields之一时,都会调用该键盘通知,并且其中的代码将运行。我知道我发表了声明,但我想知道为什么我对此一无所获。 我不确定如何收到此错误或如何调试它。是因为我正在模拟器中运行它吗? 这是打印notification.userInfo给出

  • 问题内容: 在Swift中,我可以声明一个类型常量并将其放入。 好。另一方面,我 不能 输入值,因为它不是可选的。 完善。但是为什么编译器允许我编写以下代码? 是否不遵循Swift规则,只能使用Optional var / let填充? 经过Xcode Playground 7.2 + Swift 2.1.1的测试 问题答案: TL; DR; swift中的可选项由编译器转换为枚举实例,并且由于可

  • 问题内容: 我在Swift 中使用了一个,但是当我尝试更改单元格标签的文本时得到了提示。 有人知道吗? 问题答案: 几乎可以肯定,您的重用标识符不正确。 从方法签名中我们可以看到,返回类型是 Implicitly Unwrapped Optional : 这由以下的感叹号决定: 因此,首先要考虑的是什么是“隐式展开的可选”? Swift编程语言告诉我们: 有时,从程序的结构中可以明显看出,在设置了