在 swift 中解包可选值

unwrapping optionals in swift

我仍在努力思考 swift 中的可选项。有人可以解释为什么当我们创建模型对象时我们放了一个 '!'在创建 quizCountries 字符串数组之后以及创建字符串数组时,我们还放置了 '!'并将其设置为零。我真的不明白为什么我们希望程序中的某些东西永远为零。

//  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

属性 名称后的感叹号表示这是一个隐式展开的可选

Implicitly unwrapped optionals are useful when an optional’s value is confirmed to exist immediately after the optional is first defined and can definitely be assumed to exist at every point thereafter. The primary use of implicitly unwrapped optionals in Swift is during class initialization, as described in Unowned References and Implicitly Unwrapped Optional Properties.

这些在引用对象时很有用,例如model 在您的情况下,在 QuizViewController 初始化时尚不清楚,但仍保证在首次使用前可用并分配给 model 属性。 quizCountries 也是如此,我们在创建控制器时还不知道这些国家/地区,但在使用它们之前肯定会知道它们。

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

如果您通过从界面生成器中的元素拖动到源文件来创建 IBOutlet,它们默认为具有 ! 的隐式展开可选 (IUO)。您可以使用 ? 手动将它们更改为适当的可选值,以便您可以仔细处理它们并让编译器检查所​​有情况。

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

  1. 在视图加载之前(在调用 viewDidLoad 之前)它们将为零。
  2. 如果您明确将它们设置为 nil
  3. 如果该项已从 Interface Builder 中删除。
  4. 如果插座已从 Interface Builder 中删除。
  5. 如果您在 Interface Builder 中有多个 views/view 控制器使用相同的 class 并且一个连接了插座而另一个没有。
  6. 如果您有两个故事板(例如,一个用于 iPhone,一个用于 iPad),它们都引用相同的 class,但只有一个连接了 IBOutlet。
  7. 如果您曾经卸载视图,outlets 可能会再次变为 nil。

考虑到所有这些可能性,我更喜欢使用适当的可选值。我在博客上写了关于该主题的 how I deal with optionals and also gave a talk