Я делаю ферму, где все, что можно выращивать, соответствует протоколу Growable. Когда вы сажаете растение, вы называете эту функцию:
myFarm.planting<T: Growable>(qty: Int, of: T.Type) -> Farm
Теперь я хочу, чтобы у каждого экземпляра фермы был экземпляр словаря var, например:
var crops = [Growable.Type: Int]
Проблема в том, что даже если я сделаю протокол Growable наследованием от Hashable, это не поможет растущему типу стать Hashable.
Другими словами, даже если я добавлю расширение к Growable вот так:
extension Growable {
static func hashValue {
// return some hash
}
}
... все же Growable type не является Hashable, поскольку протокол Hashable касается только экземпляров типов, но не самих типов.
Что ж, обычно я сдаюсь и говорю: «Я глуп, не пытайся делать это дальше».
Однако это Swift, поэтому я полагаю, что должен быть способ подчинить язык моей воле, будь то создание нового протокола StaticHashable и последующее расширение типа Dictionary с помощью нового метода подстрочного индекса, принимающего это, или путем модификации самого исходного кода Swift и затем внесите свой вклад в список Evolution.
Но прежде чем я пойду по одному из этих путей, я подумал, что будет разумным спросить вас, гения, есть ли уже способ делать то, что я хочу, или это невероятно глупо, и вы представите мне явно превосходный подход, которым я был невероятно глупо, что все это время как-то упускал.
Примечание: я считаю, что сами типы должны иметь возможность статически придерживаться протоколов, функции которых не объявлены как статические, поскольку почему отправитель сообщения должен заботиться о том, является ли отвечающая сущность бессмертным Богом или эфемерным существом, созданным в некоторых Образ Бога?