2014-06-11 10 views
5

In "Master-Details" app Swift campione che viene fornito con XCode 6 in MasterViewController.swift file di essi definiscono objects in questo modo:Perché l'esempio di app iOS in XCode 6 controlla zero di una variabile non facoltativa?

var objects = NSMutableArray() 

Poi nel insertNewObject metodo controllano contro nil prima di utilizzarlo:

func insertNewObject(sender: AnyObject) { 
    if objects == nil { 
     objects = NSMutableArray() 
    } 
    objects.insertObject(NSDate.date(), atIndex: 0) 
    let indexPath = NSIndexPath(forRow: 0, inSection: 0) 
    self.tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic) 
} 

Se objects non è opzionale e objects = nil genera un errore, perché devono essere protetti da nil?

+2

Penso che sia solo un bug nel codice del template ... dovresti inviare un bug report –

risposta

0

Non è necessario proteggersi contro nil. Questo è l'intero punto degli optionals (o non-optionals). Inoltre, in Swift, quando si sei prova per nil, se la variabile è un optional (che è l'unica volta che potrebbe essere nil comunque), si può solo dire:

if optionalVar { 
    // do stuff 
} 

Questo è probabilmente solo tradotto dalla versione Objective-C di Xcode e non è "Swifty".

Un altro esempio di questo genere di cose:

init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { 
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 
    // Custom initialization 
} 

Il // Custom initialization dovrebbe andare al di sopra del super.init() a Swift, ma questo è solo tradotto dalla versione Objective-C.

1

Questo è un bug; Trovo sorprendente che compili senza errori o avvertimenti. (Credo che probabilmente stato trasformato in una chiamata a IsEqual :, passando nullo?) È interessante notare che la versione più idiomatica:

if objects { 
    objects = NSMutableArray() 
} 

realtà non riescono; si riceve un errore sulla riga if objects perché non è possibile testare un NSMutableArray per la boolean-ness.

Problemi correlati