2016-05-04 5 views
4

Einfach ausgedrückt: Wie kann ich vermeiden, ! für jede Zeile im folgenden Swift-Code zu schreiben? Ich dachte guard, aber der UITableViewCell Initialisierer kann zurückgeben nil, aber andererseits cellForRowAtIndexPathmuss zurückgeben non-nil, die wie ein Widerspruch in sich scheint. Hoffe, es gibt einen kurzen und süßen Weg.Vermeidung von Übertreibungen! Verwendung in der Swift-Funktion (cellForRowAtIndexPath)

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    var cell = tableView.dequeueReusableCellWithIdentifier(reuseIdentifier) 
    if cell == nil { 
     cell = UITableViewCell(style: .Default, reuseIdentifier: reuseIdentifier) 
    } 
    cell!.textLabel?.text = ... 
    cell!.textLabel?.textColor = ... 
    cell!.detailTextLabel?.textColor = ... 
    cell!.detailTextLabel?.textColor = ... 
    return cell! 
} 
+3

plus eins für die Qualität des Codes zu kümmern. –

+1

@ PaulCantrell Antwort ist großartig, aber wenn Sie eine ähnliche Situation, in der Sie die Optionalität einer Variablen nicht entfernen können, können Sie die 'if let 'Anweisung, den optionalen Wert an einen neuen Namen (vielleicht sogar die gleicher Name) als nicht optional, und gibt Ihnen auch die Möglichkeit, den 'nil' Fall zu behandeln. https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html – Alexander

Antwort

5

Der ?? Betreiber versteht, dass, wenn die rhs nicht optional ist, dann wird das Ergebnis nicht optional:

let cell = tableView.dequeueReusableCellWithIdentifier(reuseIdentifier) 
    ?? UITableViewCell(style: .Default, reuseIdentifier: reuseIdentifier) 
cell.textLabel?.text = ... // No ! needed 

Noch besser wäre es, wenn Sie Ihre Zellidentifikatoren registrieren (entweder in einem Storyboard oder mit der registerNib/registerClass Methoden), dann können Sie die neuere Form der dequeueReusableCellWithIdentifier verwenden, die keine optionalen zurückgibt:

let cell = tableView.dequeueReusableCellWithIdentifier("repo", forIndexPath: indexPath) 
cell.textLabel?.text = ... // No ! needed 
+0

Natürlich! Ich erinnere mich, dass ich in der Dokumentation darüber gelesen habe. Eine perfekte Verwendung dafür. – forthrin

2

Lassen Sie mich some direkt von der UITableView öffentliche API kopiert haben:

public func dequeueReusableCellWithIdentifier(identifier: String, forIndexPath indexPath: NSIndexPath) -> UITableViewCell 
// newer dequeue method guarantees a cell is returned and resized properly, assuming identifier is registered 

bei dem oben beschriebenen Verfahren der Suche, es garantiert eine richtige Zelle zurückkehrt, so dass der Rückgabetyp ist nicht optional und können Sie vermeiden, Kraft auszupacken.

-1

Sie können auch wie dieser Code:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier(reuseIdentifier)! 
    cell.textLabel?.text = ... 
    cell.textLabel?.textColor = ... 
    cell.detailTextLabel?.textColor = ... 
    cell.detailTextLabel?.textColor = ... 
    return cell 
} 
Verwandte Themen