2015-03-30 12 views
5

Sono nuovo con Swift e sto giocando con la lingua. Ho appreso il concetto di variabile calcolata e osservatore variabile. Voglio sapere se è possibile definirli entrambi nello stesso momento in cui definisco una variabile. Ho provato ma non ci sono riuscito. Di seguito è riportato il mio codice (non funziona!).Swift language: come definire una variabile calcolata con observer?

var a:Int = 88 
{ 
    get 
    { 
     println("get...") 
     return 77 
    } 

    set 
    { 
     a = newValue + 1 
    } 
} 
{ 
    willSet 
    { 
     println("In willSet") 
     println("Will set a to \(newValue)") 
     println("Out willSet") 
    } 

    didSet 
    { 
     println("In didSet") 
     println("Old value of a is \(oldValue)") 
     println(a) 
     if(a % 2 != 0) 
     { 
      a++ 
     } 
     println("Out didSet") 
    } 
} 

println(a) 
a = 99 

println(a) 

Voglio sapere, è possibile? Grazie.

+0

Quanto sopra non verrà compilato: parentesi errate. – GoZoner

risposta

3

Non si può fare:

Welcome to Swift version 1.2. Type :help for assistance. 
    1> class Foo { 
    2.  var bar : Int { 
    3.   get { return 1 } 
    4.   willSet { println ("will") } 
    5.  } 
    6. }  
repl.swift:3:9: error: willSet variable may not also have a get specifier 
     get { return 1 } 
     ^

I messaggi di errore descrive il perché.

1

Penso che gli osservatori di proprietà possano essere applicati solo alle proprietà memorizzate. Le proprietà calcolate e gli osservatori delle proprietà sono simili nel senso che entrambi vengono chiamati quando il valore di una proprietà cambia e possiamo persino considerare le proprietà calcolate come osservatori di proprietà

Quindi, non penso che possiamo definire una variabile calcolata con osservatore.

6

La risposta breve, non è possibile.

Penso che l'idea di Proprietà calcolate e Proprietà memorizzate sia piuttosto esclusiva.

Parlando di Proprietà archiviate, pensateci come variabili membro con funzionalità per sapere quando vengono impostate o assegnate. Sono memorizzati non calcolati e quindi potrebbero essere assegnati a un valore e potrebbero essere impostati o assegnati da altre classi o metodi al di fuori della classe di definizione.

In caso di proprietà calcolate vengono calcolate ogni volta che si accede e quindi non vengono memorizzate. Sento che anche l'idea di impostazione non è in linea con Proprietà calcolate perché se si imposta non è calcolata.

In caso di setter in una proprietà, si sa quando viene impostato o assegnato e quindi non c'è bisogno di willSet o didSet.

var myProp: String { 
    set { 
     //You know it is being set here. :-) 
     //No need of an event to tell you that! 
    } 
} 
1

Per le proprietà calcolate, gli osservatori non aggiungerebbero molto. E 'facile fare l'equivalente in funzione impostata in questo modo:

set { 
    // do willSet logic here 
    let oldValue = a 

    a = newValue + 1 

    // do didSet logic here 
} 

Se la logica willSet o didSet è complesso, si può rifattorizziamo fuori in funzioni membro come la willSetA o didSetA.

Problemi correlati