Использование AnyObject
является запахом кода, обычно вы используете только ограниченный набор объектов для передачи вашему классу, и, глядя на код из вопроса, набор содержит только два типа: Trivia
, и Diy
. Так почему бы не поместить их обоих под один и тот же зонт?
protocol Question {
var answers: [String:[Int]] { get } // or the actual dictionary type from your code
}
Затем вы можете просто объявить соответствие протокола для двух классов:
extension Trivia: Question {
// nothing to do, Trivia should already have an answers property
}
extension Diy: Question {
// nothing to do, Trivia should already have an answers property
}
, и используйте его в своем ВК:
var questionAll : Question?
override func viewDidLoad() {
super.viewDidLoad()
//based on the game title decide which game played
if passedTitle == "Trivia" {
questionAll = Trivia()
}else if passedTitle == "Diy" {
questionAll = Diy()
}
//calculate the total grades
if let questionAllInstance = questionAll,
let points = questionAllInstance.answers["level\(level)"] {
for singlePoint in points { // I replaced the forced unwrap to the optional binding above
let sumGrade = singlePoint.reduce(0, {$0 + $1})
totalGrade += sumGrade
}
}
Теперь, если вы действительно заинтересованы в объявлении AnyObject
или вынуждены использовать его по другим причинам, вы можете использовать switch
, чтобы уменьшить дублирование в исходном коде:
override func viewDidLoad() {
super.viewDidLoad()
//based on the game title decide which game played
if passedTitle == "Trivia" {
questionAll = Trivia()
}else if passedTitle == "Diy" {
questionAll = Diy()
}
let answers: TypeOfAnswers? // an optional of what the `answers` property is
switch questionAll {
case let trivia as Trivia: answers = trivia.answers
case let diy as Diy: answers = diy.answers
default: answers = nil
}
if let points = answers?["level\(level)"] {
for singlePoint in points {
let sumGrade = singlePoint.reduce(0, {$0 + $1})
totalGrade += sumGrade
}
}
В качестве альтернативы, вы можете использовать локальную функцию для обработки ответов:
override func viewDidLoad() {
super.viewDidLoad()
//based on the game title decide which game played
if passedTitle == "Trivia" {
questionAll = Trivia()
}else if passedTitle == "Diy" {
questionAll = Diy()
}
func process(answers: TypeOfAnswers) {
if let points = questionAllInstance.answers["level\(level)"] {
for singlePoint in points { // I replaced the forced unwrap to the optional binding above
let sumGrade = singlePoint.reduce(0, {$0 + $1})
totalGrade += sumGrade
}
}
}
switch questionAll {
case let trivia as Trivia: process(answers: trivia.answers)
case let diy as Diy: process(answers: diy.answers)
default: break
}