可选类型“问题?”的值必须解包以引用已包装基本类型“问题”的成员“问题文本”

Posted

技术标签:

【中文标题】可选类型“问题?”的值必须解包以引用已包装基本类型“问题”的成员“问题文本”【英文标题】:Value of optional type 'Question?' must be unwrapped to refer to member 'questionText' of wrapped base type 'Question' 【发布时间】:2019-01-08 20:45:37 【问题描述】:

我正在制作一个小问答 ios 应用程序。我希望第一个问题是随机的。我的代码如下。

let allQuestions = QuestionBank()
var pickedAnswer : Bool = false
//Place your instance variables here


@IBOutlet weak var questionLabel: UILabel!
@IBOutlet weak var scoreLabel: UILabel!
@IBOutlet var progressBar: UIView!
@IBOutlet weak var progressLabel: UILabel!

override func viewDidLoad() 
    super.viewDidLoad()
    let firstQuestion = allQuestions.list.randomElement();
    questionLabel.text = firstQuestion.questionText


我正在使用 .list 访问数组,但我希望每次启动应用程序时第一个问题都是随机元素。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

看起来firstQuestion 可以是nil,所以它的类型是Question?。如果你想使用它的questionText 属性,你必须解开你的问题。一种方法是通过可选绑定

if let firstQuestion = allQuestions.list.randomElement() 
    questionLabel.text = firstQuestion.questionText

【讨论】:

为您的帮助干杯。【参考方案2】:

如果list 为空,则没有要选择的元素,randomElement 将返回nil。这类似于.first.last 属性。

您可以简单地使用可选链接来处理:

let firstQuestion: Question? = allQuestions.list.randomElement()
questionLabel.text = firstQuestion?.questionText

由于list 可能永远不会为空,因此这种情况实际上永远不会发生。我们只需要处理它,因为编译器无法确定。

【讨论】:

现在我觉得......我忘了可选链接:( @RobertDresler 这只是因为UILabel.text 可以采用可选的。这只是其中一种选择。

以上是关于可选类型“问题?”的值必须解包以引用已包装基本类型“问题”的成员“问题文本”的主要内容,如果未能解决你的问题,请参考以下文章

为啥在这种情况下 Array 的元素是可选的?

XCode 6 Beta 6 Beta 7 中的错误 - 可选类型的值未解包

可选类型“字符串?”的值未解包错误

自动装箱拆箱

猫猫学swift3.1可选类型_解包_可选链

猫猫学swift3.1可选类型_解包_可选链