我应该如何解开一个可选的但最有可能设置的成员变量?

问题描述 投票:0回答:2

我有一个在init / constructor内部运行一个函数的类,该函数在...数组上循环...

struct Answer {
   let correct: Bool
   let text: String
}

...并搜索将correct布尔变量设置为true的对象。循环和搜索是通过名为getCorrectId()的函数完成的,该函数将索引返回到放置了correct:trueAnswer的位置。

该函数的实现如下:

private func getCorrectId() -> Int? {
   for i in 0..<self.answers.count {
      if self.answers[i].correct {
         return i
      }
   }

   return nil
}

如您所见,该函数返回一个可选的整数。在99.9%的情况下,它应该不会失败,如果失败,那是因为我自己在代码中的某个地方犯了逻辑编程错误。

SolutionHandler类,包括init()和getCorrectId()函数

struct Answer {
   let correct: Bool
   let text: String
}

class SolutionHandler { 

   var correctId: Int?
   var answers = [Answer]()

   init(correctSolution: String, incorrectSolutions: [String]) {

      // Add the correct solution to the answers array
      self.answers.append(Answer(correct: true, text: correctSolution))

      // Add the incorrect solutions to the answers array
      for incorrectSolution in incorrectSolutions {
         self.answers.append(Answer(correct: false, text: incorrectSolution))
      }

      // Shuffle the answers to make them random in array
      self.answers.shuffle()

      <-- IMPORTANT PART

      // Find the correct id (with forced unwrap)
      self.correctId = getCorrectId()!

      -->
   }

   private func getCorrectId() -> Int? {
      for i in 0..<self.answers.count {
         if self.answers[i].correct {
            return i
         }
      }

      return nil
   }
}

所以,我的主要问题...我应该如何解开此可选内容?如果getCorrectId()函数失败并在创建类时进行处理,是否可以强制将其包装?或者应该将类SolutionHandler设置为nil吗?还是应该在创建此类时抛出自定义错误并捕获它?

谢谢! :)

swift
2个回答
0
投票

是否可以强制打开包装?如果getCorrectId()函数失败并在创建类时进行处理,我应该使类SolutionHandler设置为nil吗?还是应该在创建此类时抛出自定义错误并捕获它?

这完全取决于该值是否为nil / not,如果您确定它将为100%nonnil,则使用!,否则使所有内容都可选,也可以简化此功能

private func getCorrectId() -> Int? {
  return self.answers.index(where:{ $0.correct}) 
}

0
投票

我会做这样的事情:

if result = getCorrectId() {
  self.correctId = result
}

如果不是getCorrectID(),则仅分配nil的结果。

© www.soinside.com 2019 - 2024. All rights reserved.