Как я могу ссылаться на свойства из структуры в структуре / - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь понять, как сделать мой код наиболее эффективным с помощью структур / классов, и я пытаюсь понять это с помощью следующего примера.

Я был бы очень благодарен, если бы кто-нибудь мог меня поправить или направить примерно то же самое:

В качестве примера я использую Гарри Поттера. Всего четыре дома, и каждый из них имеет определенные характеристики.

Итак, теперь у меня есть структура для двух из них:

struct Gryffindor {
    let name = "Gryffindor"
    let characteristic = "Brave"
    let image = Image("Lion")
}

struct Slytherin {
    let name = "Slytherin"
    let characteristic = "Cunning"
    let image = Image("Snake")
}

Теперь, если я хочу sh иметь структуру мастера, как показано ниже, но я не знаю, как включить свойство House внутри, так что когда я пытаюсь создать экземпляр мастера, я могу вызывать свойства из их соответствующих домов.

struct Wizard {
        let name: String
        var house: ?
    }

let harryPotter = Wizard(name: "Harry", house: Gryffindor)

В основном, я sh могу ссылаться на дом Гарри, используя экземпляр harryPotter, как таковой:

print(harryPotter.characteristic) //should print "Brave"

Возможно ли то, что я пытаюсь достичь?

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Прежде всего вы смешиваете типы с объектами, поэтому у вас должен быть тип House

struct House {
    let name: String
    let characteristic: String
    let image: Image
}

, а затем использовать его в структуре Wizard

struct Wizard {
    let name: String
    var house: House
}

И теперь вы сначала создаете объект House для Wizard, а затем объект Wizard

let gryffindor = House(name: "Gryffindor", characteristic: "Brave", image: Image("Lion"))
let harryPotter = Wizard(name: "Harry", house: gryffindor)

или все за один вызов

let harryPotter = Wizard(name: "Harry", 
                         house:  House(name: "Gryffindor", characteristic: "Brave", image: Image("Lion")))
1 голос
/ 05 мая 2020

Используйте протокол и обобщения, как показано ниже. Протестировано с Xcode 11.4.

protocol House {
    var name: String { get }
    var characteristic: String { get }
    var image: Image { get }
}

struct Gryffindor: House {
    let name = "Gryffindor"
    let characteristic = "Brave"
    let image = Image("Lion")
}

struct Wizard<H: House> {
    let name: String
    var house: H
}

let harryPotter = Wizard(name: "Harry", house: Gryffindor())
...