我有一个在init / constructor内部运行一个函数的类,该函数在...数组上循环...
struct Answer {
let correct: Bool
let text: String
}
...并搜索将correct布尔变量设置为true的对象。循环和搜索是通过名为getCorrectId()的函数完成的,该函数将索引返回到放置了correct:true的Answer的位置。
该函数的实现如下:
private func getCorrectId() -> Int? {
for i in 0..<self.answers.count {
if self.answers[i].correct {
return i
}
}
return nil
}
如您所见,该函数返回一个可选的整数。在99.9%的情况下,它应该不会失败,如果失败,那是因为我自己在代码中的某个地方犯了逻辑编程错误。
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吗?还是应该在创建此类时抛出自定义错误并捕获它?
谢谢! :)
是否可以强制打开包装?如果getCorrectId()函数失败并在创建类时进行处理,我应该使类SolutionHandler设置为nil吗?还是应该在创建此类时抛出自定义错误并捕获它?
这完全取决于该值是否为nil / not,如果您确定它将为100%nonnil,则使用!
,否则使所有内容都可选,也可以简化此功能
private func getCorrectId() -> Int? {
return self.answers.index(where:{ $0.correct})
}
我会做这样的事情:
if result = getCorrectId() {
self.correctId = result
}
如果不是getCorrectID()
,则仅分配nil
的结果。