Purtroppo Swift non supporta tale composizione tipo ancora.
Tre buone soluzioni ragionevoli come soluzione alternativa (il terzo è probabilmente il migliore):
1. È possibile fare un altro tipo con ha le proprietà e tutti i tipi devono ereditare da esso in modo da essere usato come model
.
class SomeManagedObject: NSManagedObject, SomeProtocol {
// conforming to protocol
func someMethod()
}
// type declaration
var model: SomeManagedObject
2. Un modo più statica per risolvere questo problema è quello di utilizzare farmaci generici:
class Aclass<T: NSManagedObject where T: SomeProtocol > {
var model: T
}
Nota: Non è necessario preoccuparsi di altro tipo, che deve essere la superclasse, ma questo la soluzione non è così dinamica e astratta come quella precedente.
3. Si potrebbe anche fare il vostro proprio protocollo e fare NSManagedObject
conformarsi però un'estensione:
protocol ManagedProtocol {
// if you want to access some methods/properties directly from the type
func method()
var variable: Int { get }
// otherwise call all methods/properties through "managedObject"
// this property also reduces casting if you want to have the object itself
var managedObject: NSManagedObject { get }
}
extension NSManagedObject: ManagedProtocol {
var managedObject: NSManagedObject { return self }
}
Ora il tipo astratto e può essere scritta come:
var model: protocol<ManagedProtocol, SomeProtocol>
Siamo spiacenti, ma non credo che la dichiarazione di proprietà in Objective-C sia legale. Trovo funziona solo con 'id' –
JeremyP
Hmm, potresti avere ragione. Suppongo che sia per questo che esiste un protocollo NSObject. Mi chiedo se Swift potrebbe semplicemente auto-generare un protocollo di accompagnamento per ogni classe? – elsurudo
Se è vero, è una cosa che fa schifo, in quanto porta ad alcuni fastidiosi cast necessari – elsurudo