【问题标题】:Eliminating forced downcasts消除强迫情绪低落
【发布时间】:2020-05-31 07:40:43
【问题描述】:

我使用 swiftlint 作为一种更好的编码方式,并且在大多数情况下,我已经能够通过以下代码混淆我的方式,其中包括强制向下转换:

let questionToAdd = MultipleChoiceQuestion(question: dictionary["Question"] as! String,
            correctAnswer: dictionary["CorrectAnswer"] as! String,
            answers: dictionary["Answers"] as! [String])
           questions.append(questionToAdd)

我无法移除强制展开。任何建议将不胜感激。我曾尝试使用 ELSE { return } 但这也不起作用,可能是我的结构方式..尽管如此,任何帮助或指出我正确的方向将不胜感激。

【问题讨论】:

  • SwiftLint 是一个挑剔者。不仅有黑色和白色。强制展开本身并不邪恶。例如,如果数据是本地数据(包中的属性列表或 JSON 文件),则无法对其进行修改,并且强制解包值是 100% 安全的。如答案中所述,最好的方法是将decode的数据直接转入MultipleChoiceQuestion
  • 同意瓦迪安。我在它自己的应用程序中使用了一个属性列表。在某个时候,我们会将其移至 firebase,在这种情况下它不再是问题。

标签: swift downcast swiftlint


【解决方案1】:

强制转换的替代方法是使用as? 进行可选转换。通常,您会解开这些强制转换的结果,然后使用这些值,如下所示:

guard let question = dictionary["Question"] as? String, 
    let answer = dictionary["CorrectAnswer"] as? String,
    let answers = dictionary["Answers"] as? [String] else { return }

questions.append(MultipleChoiceQuestion(question: question, answer: answer, answers: answers))

但是,由于看起来您正在解码 JSON 之类的内容,因此更好的选择是为您的 MultipleChoiceQuestion 类型实现 Decodable,为您执行此转换。

【讨论】:

  • 我会看看Decodable并做出回应。
  • 顺便说一句,我忽略了它不是 JSON 而是字典集。您在顶部给出的内容仍然会引发一些错误:未使用闭包表达式。
  • 我又试了一次,现在我得到:非空函数应该返回一个值
  • 是的,您需要将此示例集成到您的实际代码中。由于您只提供了问题的摘录,因此我在这里只提供了一个粗略的等价物。
  • 这是回报,我昨晚很晚才发现它并让它工作。谢谢乔恩。否则 { 抛出 LoaderError.dictionaryFailed }
猜你喜欢
  • 2016-01-10
  • 2015-10-24
  • 2011-12-16
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
相关资源
最近更新 更多