我仍然试图在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
答案 0 :(得分:3)
属性名称后面的感叹号表示这是一个隐式解包的可选。
如果在首次定义可选项后立即确认可选项的值存在,并且可以假定在此后的每个点都存在,则隐式解包的选项会很有用。 Swift中隐式解包选项的主要用途是在类初始化期间,如Unowned References and Implicitly Unwrapped Optional Properties中所述。
这些在引用对象时非常有用,例如:在您的情况下,model
在QuizViewController
初始化时尚未知晓,但仍可保证在第一次使用之前可用并分配给model
属性。同样适用于quizCountries
,我们在创建控制器时还不知道这些国家,但在使用它们之前肯定会知道它们。
如果隐式展开的可选项与预期相反,在使用时(仍然)nil
,应用程序将崩溃。
答案 1 :(得分:1)
如果通过从界面构建器中的元素拖动到源文件来创建IBOutlet,则它们默认为具有!
的隐式解包选项(IUO)。您可以手动将它们更改为?
的正确选项,以便您可以仔细处理它们并让编译器检查所有情况。
您可能对nil
的情况感兴趣。这些是我想到的一些,虽然我可能错过了一些。
viewDidLoad
之前),它们将为零。nil
。鉴于所有这些可能性,我更喜欢使用适当的选项。我在此主题上发表了关于how I deal with optionals和gave a talk的博文。