可选类型的值必须被解包以引用成员,但它是隐式解包的可选属性

Posted

技术标签:

【中文标题】可选类型的值必须被解包以引用成员,但它是隐式解包的可选属性【英文标题】:Value of optional type must be unwrapped to refer to member, BUT its for an implicitly unwrapped optional property 【发布时间】:2019-09-22 13:39:44 【问题描述】:

为什么我会得到这个?它是一个隐式展开的可选属性。我不认为我应该得到这个错误。我尝试清理我的构建文件夹并删除派生数据,然后关闭 Xcode。没有任何效果。

var questionsWrap: QuestionsWrapper
    
func userMadeSelection(
    _ responseId: Int,
    _ myTheir: Question.Response.Selections.MyTheir,
    _ choice: Question.Response.Selections.MyTheir.Choice
) 
    guard let id = question.id else  return 
    questionsWrap.saveSelection(
        questionId: id,
        responseID: responseId,
        myTheir: myTheir,
       choice: choice
    )  success in
        if !success 
           AlertViewController<Any>.alertFailure(
               message:  "We made a mistake and we weren't able to save your selection."
            )
        
    
    singleQuestionDataSource.observableQuestion.value = question
    print(#line, "userMadeSelectionImportance: \(responseId) \(myTheir) \(choice)")
    if choice.changedBetweenPolarAndNeutral(
        with: questionsWrap.question.theirInteractionStyle
        ) 
        let presenter = Question.Importance.Presenter(question)
        update(presenter?.importance)
        questionCell?.importancePresenter = presenter
    

方法定义

func saveSelection(
    questionId: Int,
    responseID: Int,
    myTheir: Question.Response.Selections.MyTheir,
    choice: Question.Response.Selections.MyTheir.Choice,
    context: Context,
    successAction: SuccessAction? = nil
) 
        
        guard let questionIndex = questions.index(of: questionId),
            let responseIndex = questions[questionIndex].responses.index(of: responseID) else 
                successAction?(false)
                return
        
        
        questions[questionIndex].responses[responseIndex].set(myTheir, choice, for: context)
        let response = questions[questionIndex].responses[responseIndex]
        URL.make(
           my: response.choice(for: .my, UserDefaults.questionContext),
           their: response.choice(for: .their, UserDefaults.questionContext),
           forResponseID: responseID,
           forQuestionID: questionId,
           forContext: UserDefaults.questionContext
           ).get  jsonDict in
            successAction?(jsonDict.success)
        
    

不幸的是,我不知道要提供什么代码来原子地重新创建此问题。

我正在打破常规并发布屏幕截图以证明错误正在显示。

【问题讨论】:

请张贴代码,而不是截图。理想情况下是minimal reproducible example。 谢谢@MartinR。我这样做了。我不知道我会在几个小时内因为我的遗忘而获得 5 次反对票。你会认为这一点会通过 1 或 2 来传达。无论如何,谢谢你通知我。 【参考方案1】:

使用隐式展开的 Optional 看到此错误消息的通常原因是隐式展开不会通过赋值来传播自身。例如,这是合法的:

    var s : String!
    print(s.count)

但这不是:

    let s2 = s
    print(s2.count) // value must be unwrapped

【讨论】:

哇,我不知道!这本身就是值得的。不幸的是,我没有在任何地方链接属性分配。【参考方案2】:

我想通了,我将saveSelection 的方法签名更改为需要另一个参数,但我忘记添加默认值或在调用中添加参数。我不知道为什么编译器没有告诉我,而是...

【讨论】:

我仍然无法重现您收到的错误消息。你能提供足够的代码让我重现吗?如果可以,我可以向 Swift 人员报告错误(因为,正如您正确暗示的那样,错误消息具有误导性)。 不包括我的整个项目,我还没有重现它。坦率地说,我不知道从哪里开始。 明白。可能不值得花时间在上面!无论如何,您认为隐式展开的 Optional 不应该产生“你需要展开这个”错误的直觉当然是正确的。这种情况应该会产生一些其他错误。

以上是关于可选类型的值必须被解包以引用成员,但它是隐式解包的可选属性的主要内容,如果未能解决你的问题,请参考以下文章

方法签名中的隐式解包可选

访问无价值的隐式解包可选?

UIViewController init 方法中的隐式解包选项

#5 kotlin nullable 可空类型

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

Python ValueError:解包的值太多,解决方案?