errore: Protocollo requisito 'protocollo' 'esempio' non può essere soddisfatta da una classe non definitiva ('Classe') perché utilizza 'Self' in un non-parametro, non risultato tipo di posizioneCome implementate i metodi di protocollo che restituiscono Selfs covarianti?
protocol Protocol {
var instance: Self {get}
}
class Class: Protocol {
var instance: Class {return Subclass()}
}
class Subclass: Class {}
Ecco come esprimerei ciò che voglio, in C#. (C# non ha, per quanto sappia, un modo per far osservare che il parametro generico "Sé" è in realtà il Sé che conosciamo da Swift, ma funziona abbastanza bene come documentazione che dovrebbe farmi fare la cosa giusta.)
interface Protocol<Self> where Self: Protocol<Self> {
Self instance {get;}
}
class Class: Protocol<Class> {
public Class instance {get {return new Subclass();}}
}
class Subclass: Class {}
... come che potrebbe apparire in una futura versione di Swift:
protocol Protocol {
typealias FinalSelf: Protocol where FinalSelf.FinalSelf == FinalSelf
var instance: FinalSelf {get}
}
class Class: Protocol {
var instance: Class {return Subclass()}
}
class Subclass: Class {}
Come sto emulando la porzione di ciò che è rilevante per il mio problema:
protocol Protocol: ProtocolInstance {
static var instance: ProtocolInstance {get}
}
protocol ProtocolInstance {}
class Class: Protocol {
static var instance: ProtocolInstance {return Subclass()}
}
class Subclass: Class {}
E, qui è quello che ritengo essere la quota di competenza del mio codice:
protocol Protocol {
static var : Self? {get} // an existing instance?
static var : Self {get} // a new instance
func instanceFunc()
}
extension Protocol {
static func staticFunc() {
(??).instanceFunc()
}
}
Sembra un bug: è possibile creare costrutti simili per metodi di istanza, ma non per metodi di classe o proprietà statiche. [Lo hai archiviato?] (Http://bugreport.apple.com) – rickster
Non riesco a farlo compilare neanche. Modificato. – Jessy
Credo che il codice di esempio aggiornato da C# sia esattamente equivalente al mio codice 'typealias InstanceType'. C'è qualche differenza comportamentale? Se hai chiamato 'Subclass.instance()' nel tuo C#, il tipo restituito (non l'implementazione, ma il tipo di variabile) non sarebbe 'Class'? –