为什么我必须使用可选的“?”在这段代码中?

问题描述

为什么我不能只写“ var response: String ”而没有可选的“?”在第三行下面的程序中?

class SurveyQuestion {
   var text: String
   var response: String? //here
  init(text: String) {
      self.text = text
  } 
  func ask() {
    print(text)
  }
}
let cheeseQuestion = SurveyQuestion(text: "Do you like cheese?")
cheeseQuestion.ask()
// Prints "Do you like cheese?"
cheeseQuestion.response = "Yes,I do like cheese."

解决方法

想想如果在分配之前尝试访问 response 会得到什么:

let cheeseQuestion = SurveyQuestion(text: "Do you like cheese?")
print(cheeseQuestion.response) // what would this print?

它一定是某种价值,对吧?最有意义的值是表示“这个问题尚未没有响应”的值,这就是 nil 的含义 - 没有值。将 response 设为可选会产生将其默认值设为 nil 的副作用。

如果你不希望它是可选的,那也没关系,但你必须给它一个默认值(不是 nil,只有可选值才能有 nil 作为值!)

class SurveyQuestion {
    var text: String
    var response: String = "some default response"
    init(text: String) {
        self.text = text
    }
}

或者你可以在初始化器中初始化它:

init(text: String) {
    self.text = text
    self.response = "some default response"
}

或者您可以向初始化程序添加一个参数并将其初始化为:

init(text: String,response: String) {
    self.text = text
    self.response = response
}

本质上,如果 response 不是可选的,它需要具有一些值,当它的初始化程序完成运行时它不是 nil

,

如果您不想要可选的,则为该变量提供一个初始值。

示例:- var response: String = "ABC"