2014-10-04 14 views
20

So che questa risposta è già stata pubblicata in qualche altra forma qui, ma mi piacerebbe capire di più sull'override delle variabili di istanza in swift.Variabili di istanza di override rapide

Diciamo che ho questo codice

class BaseView:UIView{ 
let someVariable:Int = 1 
// do some work with someVariable 
} 

class ExtendedView:BaseView{ 
let someVariable:Int = 2 
} 

Ok. Da quello che ho letto, la costante richiede un prefisso override. Altre risposte hanno detto che dovrei dichiarare il setter e il getter? Perché? Non mi importa davvero di quei due. Ho solo bisogno del valore sostituito. Non riesco a utilizzare l'override init perché sto ereditando da UIView e questo potrebbe essere piuttosto pericoloso (credo).

Qualsiasi suggerimento è benvenuto.

+0

come scritto quelli sembrano variabili di classe separate e non correlate, solo con lo stesso nome. –

risposta

43

Come dici tu, non puoi semplicemente ridefinire una costante in una sottoclasse (è una costante, dopo tutto). L'errore che si ottiene è "Impossibile eseguire l'override con una proprietà memorizzata". Sembra che sia possibile sovrascrivere un var, tuttavia, quando cambio lo let someVariable in var someVariable ottengo "l'uso ambiguo di 'someVariable'" quando accedo nella sottoclasse (nota: la stessa cosa accade se io uso override o meno) .

La soluzione più semplice è utilizzare un getter. Questo è in realtà una funzione, in modo da poter tranquillamente ignorarlo, la variabile supporto sarà gestita per voi, e se non si fornisce un setter ... sarà costante per ogni classe:

class BaseView: UIView { 
    var someVariable: Int { get { return 1 } } 
    // do some work with someVariable 
} 

class ExtendedView: BaseView { 
    override var someVariable: Int { get { return 2 } } 
} 

let a = BaseView() 
a.someVariable // 1 
let b = ExtendedView() 
b.someVariable // 2 

Come commentatore @ user3633673 fa notare, se si solo ha un getter (e non un setter), è possibile rilasciare il get, ma l'ho lasciato per chiarezza del principio. Ecco lo stesso senza ...

class BaseView: UIView { 
    var someVariable: Int { return 1 } 
    // do some work with someVariable 
} 

class ExtendedView: BaseView { 
    override var someVariable: Int { return 2 } 
} 

let a = BaseView() 
a.someVariable // 1 
let b = ExtendedView() 
b.someVariable // 2 
+8

Per alcuni lettori si dovrebbe notare che il "get" non è necessario in semplici proprietà calcolate di sola lettura. 'var someVariable: Int {return 1}' è una scorciatoia per 'var someVariable: Int {get {return 1}}'. – user3633673

+0

Grazie, molto ben spiegato! –

Problemi correlati