【问题标题】: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 访问数组,但我希望每次启动应用程序时第一个问题都是随机元素。任何帮助将不胜感激。

【问题讨论】:

    标签: ios arrays swift


    【解决方案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 可以采用可选的。这只是其中一种选择。
    猜你喜欢
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    相关资源
    最近更新 更多