问题描述
为什么我不能只写“ 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"