2015-03-19 2 views
12

J'ai rencontré un problème étrange en considérant un entête d'un UICollectionView.UICollectionReusableView - Retour manquant dans une fonction

I essentiellement utilisé le code de: 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") 
      } 
    } 

Tout ce qui fonctionne parfaitement bien lors du déploiement instantanément soit le simulateur ou un dispositif réel, mais bizarrement quand je veux construire un paquet ad hoc pour les tests fins, il me dit

retour manquant dans une fonction devrait revenir 'UICollectionReusableView'

Ok, jusqu'ici tout va bien, il n'y a rien à l'extérieur de l'interrupteur pour qu'il ne puisse rien retourner - mais pourquoi ne donne-t-il aucun avertissement sur le "déploiement à chaud" uniquement lorsque j'essaye de construire un paquet?

Répondre

38

assert() est évalué uniquement dans la configuration de débogage. Lorsque vous construisez une archive puis le code est compilé dans la configuration Release (avec optimisations) et la condition est simplement ignorée (supposé être true). Par conséquent le compilateur se plaint de la valeur de retour manquante.

Vous pouvez utiliser

fatalError("Unexpected element kind") 

à la place. fatalError() est toujours évalué et en outre marqué avec @noreturn (respectez le type Never dans Swift 3) de sorte que le compilateur sache qu'il ne retourne pas à son appelant.

Voir aussi Swift - fatalError with Switch Statements.

+0

merci pour la perspicacité – longbow

+0

Vous êtes partout! Merci pour encore une autre réponse. :) – Crashalot

+0

A BIG THUMBS UP .. –