2014-06-13 10 views
11

Swift ha rilasciato la convenzione del prefisso di sottolineatura per le variabili di istanza, ad esempio _window? Se è così, perché?Prefisso chiave di sottolineatura Swift istanza?

+0

Le risposte sottostanti sono degne di una "risposta"? – GoZoner

+1

Certo, ne ho selezionato uno. – ma11hew28

+0

La cosa che mi infastidisce di questo è che la proprietà rapida può apparentemente essere accessibile con o senza riferimento a sé. Quindi, se vedi una variabile chiamata "count", non c'è modo di determinare a colpo d'occhio se si tratta di una variabile di istanza o di una variabile locale (di cui sono a conoscenza). E le variabili di istanza possono essere "fuori ambito" dalle variabili locali! Argh. $ 5 dice che la notazione di sottolineatura tornerà per Swift 3. – dave

risposta

14

In Objective-C quando si dichiara una proprietà @synthesize creerebbe automaticamente getter e setter automaticamente dal clang 3.2. Così, il @synthesize predefinito per una proprietà "pippo" sarebbe simile a questa:

@synthesize foo = _foo

a causa di quella _foo sarebbe quindi l'iVar. In altre parole si potrebbe avere fatto il @synthesize te stesso e ha chiamato l'iVar qualunque ti è piaciuto:

@synthesize foo = myiVarFoo

quindi in questo caso non v'è alcun "_"

Così ora a Swift da the documentation:

Swift unifica questi concetti in una singola dichiarazione di proprietà. Una proprietà Swift non ha una variabile di istanza corrispondente e non è possibile accedere direttamente al backing store di una proprietà.

Quindi dalla documentazione è chiaro che swift non ha una variabile di istanza corrispondente quindi non è più necessario avere il "_" in giro.

5

Il prefisso di sottolineatura era destinato a non confondere la variabile di istanza _foo con il suo getter foo.

In rapida non c'è distinzione tra ivar e getter. Invece hai solo proprietà, rendendo la convenzione _ non necessaria.

+5

esistono ancora scenari in cui una proprietà privata - che idealmente ha lo stesso nome di un getter - potrebbe essere utile. Poiché le proprietà memorizzate non possono essere sovrascritte, potrebbe essere utile avere una superclasse che fornisce un metodo di stub, ad esempio foo(), che deve essere sovrascritto dalla sottoclasse. Il metodo sottoclasse potrebbe semplicemente restituire _foo. –

16

Apple utilizza ancora _ nel suo codice di codice Xcode come convenzione per una variabile non-public. Vedrete un modello come ad esempio:

class Foo { 
    var _bar : Bar? = nil 
    var bar : Bar { 
    if _bar == nil { 
     /* compute some stuff */ 
     _bar = Bar (/* ... */) 
    } 
    return _bar! 
    } 
} 

in cui l'accesso alla proprietà è destinata ad essere attraverso la proprietà calcolata bar. Lo trovi nei modelli Apple CoreData.

+1

Ciò rende molto più semplice la conversione del mio vecchio codice. Bello. – sudo

+0

Il trattino basso viene utilizzato per disattivare la denominazione esplicita di un parametro. Dato che il compilatore Swift non è esattamente indulgente, è improbabile che ciò possa costituire una svista. Piuttosto Apple intendeva - almeno per il momento - che la sottolineatura fosse una sintassi valida del nome della variabile. –

3

La risposta è no perché al momento non ci sono "variabili di istanza" in Swift. Solo proprietà (proprietà memorizzate e proprietà calcolate).

Problemi correlati