2014-09-04 18 views
12

E 'possibile estendere tutti gli oggetti esistenti come quando si aggiunge uno category su NSObject nell'obiettivo C?Estendi tutti gli oggetti Swift

In base a questo article, tutti gli oggetti Swift ereditano dalla classe SwiftObject, ma non riesco ad aggiungere un'estensione.

C'è qualche soluzione a questo?

+3

Questa attività di SwiftObject può essere un dettaglio di implementazione, ma le classi Swift che non ereditano da un'altra classe sono per default le classi root. – Atomix

risposta

11

No. Gli oggetti Swift in realtà non ereditano da alcuna classe di base radice. Il compilatore può inserirne uno come dettaglio di implementazione, ma la lingua non ha questo.

La soluzione è una funzione e solitamente una funzione generica, piuttosto che un metodo. Qualcosa che si applica a "ogni tipo di oggetto" non è realmente incapsulato. Ci sono pochissime azioni che si applicano ad ogni cosa immaginabile nell'universo. Ma le funzioni possono mappare assolutamente qualsiasi cosa con assolutamente qualsiasi altra cosa, quindi sono uno strumento migliore qui.


Proprio come una nota, non tutti oggetti ereditano da NSObject sia, e non è un requisito di lingua. Ma hai ragione che la stragrande maggioranza lo fa. Dai un'occhiata a NSProxy per la parte superiore di un albero non-NSObject (implementa il protocollo NSObject, ma non eredita dalla classe NSObject). Ecco perché id non è la stessa cosa di NSObject*.


Per le tue domande su oggetti associati, questo è incorporato:

import Foundation 

class Thing { } 

let thing = Thing() 

var MyKey: Character = "0" 

objc_setAssociatedObject(thing, &MyKey, "I'm a value!", objc_AssociationPolicy(OBJC_ASSOCIATION_COPY)) 

println(objc_getAssociatedObject(thing, &MyKey)) 

E 'questo quello che stavi cercando di creare? Notare che objc_setAssociatedObject è anche una funzione, non un metodo, in ObjC.

+0

Quello che stavo progettando di fare era implementare qualcosa di simile all'oggetto associato di ObjectiveC. Qualche idea su come farlo con una funzione generica? – cfischer

+0

È possibile utilizzare gli oggetti associati con Swift. Perché dovresti ricrearlo? (Risposta modificata con un esempio) O intendi qualcos'altro? –

+0

@RobNapier: A volte le persone definiscono una categoria per utilizzare gli oggetti associati per poterli utilizzare tramite una normale API di metodo piuttosto che dover utilizzare le funzioni dal runtime. – newacct

Problemi correlati