Итак, я следую онлайн-руководству и понимаю все, кроме этой части. Человек объясняет мне, что это создает двоичное дерево, так сказать, где один элемент связан с двумя элементами. В этом случае страница связана с двумя страницами. Я не понимаю, как это работает в этом примере, где struct Adventure
создает двоичное дерево. Любая помощь будет оценена по достоинству. Сейчас мне очень жаль, что я вообще этого не понимаю.
import Foundation
class Page {
let story: Story
typealias Choice = (title: String, page:Page)
var firstChoice: Choice?
var secondChoice: Choice?
init(story: Story) {
self.story = story
}
}
extension Page {
// adds the page
func addChoiceWith(title: String, story:Story) -> Page {
let page = Page(story:story)
return addChoiceWith(title: title, page: page)
}
// creates branches
func addChoiceWith(title: String, page: Page) -> Page {
switch (firstChoice, secondChoice) {
case (.some, .some) : return self
case (.none, .none), (.none, .some): firstChoice = (title, page)
case (.some, .none): secondChoice = (title,page)
}
return page
}
}
struct Adventure {
static var story: Page {
let returnTrip = Page(story: .returnTrip)
let touchdown = returnTrip.addChoiceWith(title: "Stop and Investigate", story: .touchDown)
let homeward = returnTrip.addChoiceWith(title: "Continue home to Earth", story: .homeward)
let rover = touchdown.addChoiceWith(title: "Explore the Rover", story: .rover)
let crate = touchdown.addChoiceWith(title: "Open the Crate", story: .crate)
homeward.addChoiceWith(title: "Head back to Mars", page: touchdown)
let home = homeward.addChoiceWith(title: "Continue Home to Earth", story: .home)
let cave = rover.addChoiceWith(title: "Explore the Coordinates", story: .cave)
rover.addChoiceWith(title: "Return to Earth", page: home)
cave.addChoiceWith(title: "Continue towards faint light", story: .droid)
cave.addChoiceWith(title: "Refill the ship and explore the rover", page: rover)
crate.addChoiceWith(title: "Explore the Rover", page: rover)
crate.addChoiceWith(title: "Use the key", story: .monster)
return returnTrip
}
}
Каждый Page
представляет узел в дереве, а каждый Choice
представляет ветвь. Story
похож на содержимое узла. firstChoice.page
и secondChoice.page
представляют двух дочерних узлов узла.
Свойство Adventure.story
создает дерево и возвращает корневой узел. Вы можете получить доступ ко всем остальным узлам, используя корень:
Adventure.story.firstChoice.page.secondChoice.page
Теперь давайте посмотрим, как строится дерево. Обратите внимание, что это не стандартное двоичное дерево, которое вы видите все время. Родители некоторых узлов были детьми. Но у каждого узла есть двое потомков.
Превращу код в псевдокод. Вы можете следовать этому коду и самостоятельно нарисовать дерево на листе бумаги.
Create a node called "returnTrip"
Add a child to returnTrip called "touchDown"
Add a child to returnTrip called "homeward"
Add a child to touchDown called "rover"
Add a child to touchDown called "crate"
Connect homeward back to touchDown
Add a child to homeward called "home"
Add a child to rover called "cave"
Connect rover to home
Add a child to cave called "droid"
Connect cave to rover
Connect crate to rover
Add a child to crate called "monster"
@CurtR и в основном так и есть, но с title
, который можно представить как маркировку линии, соединяющей два узла.
Итак, правильно ли я предполагаю, что каждый выбор (ветвь) - это просто ссылка на свойство на другую страницу.