在swift中展开选项

时间:2015-02-22 07:53:36

标签: swift optional

我仍然试图在swift中围绕选项。有人可以解释为什么当我们创建模型对象时,我们会放置一个'!'之后以及在创建quizCountries字符串数组时,我们也会使用'!'并将其设置为nil。我真的不明白为什么我们希望程序中的某些内容永无止境。

//  QuizViewController.swift
import UIKit

class QuizViewController: UIViewController, ModelDelegate {
    @IBOutlet weak var flagImageView: UIImageView!
    @IBOutlet weak var questionNumberLabel: UILabel!
    @IBOutlet weak var answerLabel: UILabel!
    @IBOutlet var segmentedControls: [UISegmentedControl]!

    private var model: Model! // reference to the model object
    private let correctColor = UIColor(red: 0.0, green: 0.75, blue: 0.0, alpha: 1.0)
    private let incorrectColor = UIColor.redColor()
    private var quizCountries: [String]! = nil // countries in quiz
    private var enabledCountries: [String]! = nil // countries for guesses
    private var correctAnswer: String! = nil
    private var correctGuesses = 0
    private var totalGuesses = 0

2 个答案:

答案 0 :(得分:3)

属性名称后面的感叹号表示这是一个隐式解包的可选

  

如果在首次定义可选项后立即确认可选项的值存在,并且可以假定在此后的每个点都存在,则隐式解包的选项会很有用。 Swift中隐式解包选项的主要用途是在类初始化期间,如Unowned References and Implicitly Unwrapped Optional Properties中所述。

这些在引用对象时非常有用,例如:在您的情况下,modelQuizViewController初始化时尚未知晓,但仍可保证在第一次使用之前可用并分配给model属性。同样适用于quizCountries,我们在创建控制器时还不知道这些国家,但在使用它们之前肯定会知道它们。

如果隐式展开的可选项与预期相反,在使用时(仍然)nil,应用程序将崩溃。

答案 1 :(得分:1)

如果通过从界面构建器中的元素拖动到源文件来创建IBOutlet,则它们默认为具有!的隐式解包选项(IUO)。您可以手动将它们更改为?的正确选项,以便您可以仔细处理它们并让编译器检查所​​有情况。

您可能对nil的情况感兴趣。这些是我想到的一些,虽然我可能错过了一些。

  1. 在视图加载之前(在调用viewDidLoad之前),它们将为零。
  2. 如果您明确将它们设置为nil
  3. 如果该项目已从Interface Builder中删除。
  4. 如果已从Interface Builder中删除插座。
  5. 如果在Interface Builder中有多个视图/视图控制器使用相同的类,一个连接了插座而另一个没有连接。
  6. 如果你有两个故事板(例如一个用于iPhone,一个用于iPad),它们都引用同一个类,但只有一个连接了IBOutlet。
  7. 如果您卸载了视图,则插座可能会再次变为零。
  8. 鉴于所有这些可能性,我更喜欢使用适当的选项。我在此主题上发表了关于how I deal with optionalsgave a talk的博文。

相关问题