2015-03-19 14 views
12

Ich hatte ein komisches Problem, wenn man einen Kopf von UICollectionView betrachtet.UICollectionReusableView - Fehlende Rückkehr in einer Funktion

habe ich im Grunde den Code aus: http://www.raywenderlich.com/78551/beginning-ios-collection-views-swift-part-2

func collectionView(collectionView: UICollectionView, 
     viewForSupplementaryElementOfKind kind: String, 
     atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView { 

      let dateFormatter = NSDateFormatter() 
      dateFormatter.dateFormat = "dd.MM.yyyy' - 'HH:mm'" 
      //1 
      switch kind { 
       //2 
      case UICollectionElementKindSectionHeader: 
       //3 
       let h = 
       collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "eventHeaderView", forIndexPath: indexPath) as eventHeader 


       h.eventFirstline.text = "First Line" 
       h.eventSecondline.text = thisEvent.eventName 

       h.eventDate.text = dateFormatter.stringFromDate(thisEvent.startDate) 

       h.eventDescription.text = thisEvent.shortDescription 

       return h 
      default: 
       //4 
       assert(false, "Unexpected element kind") 
      } 
    } 

Alles, was perfekt funktioniert gut, wenn sofort auf die Bereitstellung von entweder dem Simulator oder einem realen Gerät, aber seltsam, wenn ich will ein Ad-Hoc-Paket zum Testen bauen Zweck es sagt mir

Fehlende Rückkehr in Funktion

zurückzukehren 'UICollectionReusableView' erwartet

Ok so weit so gut, es gibt nichts außerhalb des Switch-Case, so dass es nichts zurückgeben kann - aber warum gibt es keine Warnungen auf "hot deploy" nur, wenn ich versuche, ein Paket zu bauen?

Antwort

38

assert() wird nur in der Debug-Konfiguration ausgewertet. Wenn Sie ein Archiv erstellen, wird der Code in der Release-Konfiguration (mit Optimierungen) kompiliert und die Bedingung wird einfach ignoriert (angenommen zu true sein). Daher beschwert sich der Compiler über den fehlenden Rückgabewert .

können Sie

fatalError("Unexpected element kind") 

stattdessen verwenden. fatalError() wird immer ausgewertet und zusätzlich mit mit @noreturn gekennzeichnet (bzw. Rückgabetyp Never in Swift 3), damit der Compiler weiß, dass er nicht zu seinem Aufrufer zurückkehrt.

Siehe auch Swift - fatalError with Switch Statements.

+0

danke für den Einblick – longbow

+0

Sie sind überall! Danke für eine weitere Antwort. :) – Crashalot

+0

Ein großer Daumen hoch .. –