Sto affrontando con generici in Swift. Ho l'estensione alla classe NSManagedObject
e volevo creare l'inizializzatore che è disponibile solo per le classi che implementano alcuni protocolli definiti. Ora ho qualcosa di simile in basso, ma questo non funziona e nemmeno la compilazione. Potresti aiutarmi a farlo funzionare?Come creare un inizializzatore di convenienza generico in Swift?
public extension NSManagedObject {
public convenience init<Self: Nameable>(context: NSManagedObjectContext) {
let entity = NSEntityDescription.entityForName(Self.entityName(), inManagedObjectContext: context)!
self.init(entity: entity, insertIntoManagedObjectContext: context)
}
}
public protocol Nameable {
static func entityName() -> String
}
Xcode dice: "Il parametro generico 'Self' non viene utilizzato nella firma della funzione".
Dal momento che non hai fatto nulla che possa essere Nominato, non è chiaro cosa stai cercando di fare qui. Sembra non avere uno scopo. - Inoltre, come si risolve questo generico? - Inoltre, il sé ha un significato, quindi non dovresti abusarne come nome di un segnaposto. – matt
Ho altre sottoclassi 'NSManagedObject' e cerco di renderle in grado di chiamare' let obj = MyClass (context: context) ', ma solo se implementano' Nameable'.Vedo che questa è una dichiarazione errata e dovrebbe essere più simile a questa: 'estensione NSManagedObject dove NSManagedObject: Nameable' ma non funziona in questo modo. –
Ma non puoi fermare un'istanza dal chiamare 'let obj = MyClass (context: context)' sulla base di quale classe è questa istanza! Non ha alcun senso, in nessuna lingua. Se c'è un inizializzatore 'MyClass (context: context)', _anyone_ può chiamarlo (se può vederlo). Questa è la natura della programmazione orientata agli oggetti, se vedi cosa intendo. Né vedo alcun motivo per cui vorresti farlo. – matt