Nell'applicazione a cui sto lavorando, cerco di sfruttare la nuova funzione di estensione del protocollo in Swift. L'idea è che ho molte classi che implementano lo stesso protocollo. Poiché tutte queste classi dovrebbero avere le stesse proprietà calcolate e poiché le proprietà dovrebbero comportarsi in modo identico in classi diverse, ho pensato che sarebbe stato carino aggiungere la funzionalità una sola volta.Come si memorizzano i dati inviati alle proprietà calcolate in un'estensione di protocollo?
Il mio codice è strutturato come il seguente esempio
protocol SomeProtocol { ... }
// There could potentially be unlimited different versions of "SomeClass" that implements "SomeProtocol"
class SomeClass : SomeProtocol { ... }
extension SomeProtocol {
var computedProperty1: Type? {
get { getData(SOME_ENUM) }
set { validateAndSave(newValue, atKey: SOME_ENUM) }
}
var computedProperty2: Type? {
get { getData(SOME_OTHER_ENUM) }
set { validateAndSave(newValue, atKey: SOME_OTEHR_ENUM) }
}
...
func getData(atKey: ENUM_TYPE) -> Type? {
[NEED SOME WAY TO GET THE SAVED DATA AND RETURN IT]
}
func validateAndSave(value: Type?, atKey: ENUM_TYPE) {
[NEED SOME WAY TO SAVE DATA FOR LATER RETURNING]
}
}
// The properties needs to be visible to the client code like this:
class ClientCode {
let someClassObject: SomeProtocol = SomeClass()
someClassObject.computedProperty1 = Type()
print(someClassObject.computedProperty1)
}
(Il codice sopra mostra segni di memorizzazione dei dati in diversi dizionari, che è stato il mio primo pensiero)
Il problema è che un'estensione fa non supporta le proprietà memorizzate. Ma dove/come posso archiviare i dati inviati alle proprietà calcolate allora?
posso pensare di 2 diverse soluzioni, ma nessuno di loro bene ..
- ho potuto trasformare l'estensione in una classe che implementa
SomeProtocol
invece, e poi fareSomeClass
una sottoclasse di esso. Ciò mi permetterebbe di salvare i dati nelle proprietà archiviate. Ma mi richiederebbe anche di implementare tutti i metodi che il protocollo richiede nella nuova classe, il che non ha assolutamente senso, dal momento che sono le diverse versioni diSomeClass
che dovrebbero fornire funzionalità diverse. - Posso semplicemente eliminare l'intera estensione idea e sposta tutte le proprietà in
SomeProtocol
. Ma ciò richiederebbe l'implementazione di tutte le proprietà calcolate in tutte le diverse versioni diSomeClass
con funzionalità identiche e l'intero scopo della mia idea di estensione era evitare di scrivere la stessa implementazione per le stesse proprietà più e più volte.
C'è qualche soluzione logica completamente semplice che ho trascurato?
... o un bel modo per salvare i dati in un'estensione di protocollo che non conosco?
... o un altro modo di ottenere la funzionalità desiderata?
... o dovrei semplicemente succhiarlo e usare una delle mie soluzioni non così carine?
Se i protocolli potevano memorizzare proprietà che avrebbero solo fatto loro classi e poiché i protocolli possono essere aggiunti a una classe che è sottoclasse che essenzialmente creerebbe un'ereditarietà multipla . Ma Swift by design non supporta l'ereditarietà multipla. – zaph
Vedo il tuo punto e ciò che è in realtà anche qualcosa che ho preso in considerazione. Il problema è che questa "soluzione" interrompe il codice client, dal momento che le proprietà (memorizzate o calcolate) sono ora visibili solo nella sottoclasse. – MortenHC
@ zaph, puoi avere una classe per confermare tutti i protocolli che vuoi. Non è un'eredità multipla. Un'alternativa praticabile a uno - ma non è tecnicamente uno. – avismara