2015-09-07 8 views
5

In Swift 2.0, come posso fare l'equivalente di @property (nonatomic, strong) NSManagedObject*<SomeProtocol> model?Definire la proprietà che deve essere una sottoclasse E conforme al protocollo

Fondamentalmente, sto provando a definire una proprietà sulla mia classe che deve essere una sottoclasse di NSManagedObject E conforme allo SomeProtocol (chiamerò i metodi definiti da entrambi).

ho visto questo: https://stackoverflow.com/a/25826948/363789, ma non sono sicuro di come posso applicare questa sintassi per definizione di proprietà ...

+0

Siamo spiacenti, ma non credo che la dichiarazione di proprietà in Objective-C sia legale. Trovo funziona solo con 'id ' – JeremyP

+0

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

+0

Se è vero, è una cosa che fa schifo, in quanto porta ad alcuni fastidiosi cast necessari – elsurudo

risposta

2

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> 
3

Swift 4

Questo è ora possibile in Swift 4 usando la seguente sintassi:

var myObject: NSManagedObject & SomeProtocol 
Problemi correlati