2017-03-12 4 views
0

Je travaille avec MPMediaQuery et spécifiquement Podcasts. Je vais avoir un moment très difficile avec les options et l'emballage/déballage dans ce cas particulier.Je n'arrive pas à comprendre comment éviter le plantage avec le type de Date et l'habillage dans Swift 3

titleFilter = MPMediaPropertyPredicate(value: selectedPodcastTitle, forProperty: MPMediaItemPropertyPodcastTitle, comparisonType: .equalTo) 
    qryPodcasts.addFilterPredicate(titleFilter) 

    for junk in qryPodcasts.items!{ 

     //works fine 
     if let sTitle = junk.title { 
      print("episode title: \(sTitle)") 
     }else{ 
      print("episode title is nil") 
     } 

     //works fine 
     if let dRelease = junk.releaseDate { 
      print("episode release date: \(dRelease)") 
     }else{ 
      print("episode release date is nil") 
     } 
     if #available(iOS 10.0, *) { 
      // can't figure out how to make this work 
      // crashes on some podcasts and I suspect it's when 'addedDate' is nil 
      if let dAdded: Date = junk.dateAdded { 
       print("episode added date: \(junk.dateAdded)") 
      }else{ 
       print("episode added date is nil") 
      } 
     } else { 
      print("episode added date is not available") 
     } 
    } 
+0

Avez-vous essayé de définir un point d'arrêt et de suivre le déroulement du programme? Peut-être qu'il y a un effet secondaire de quelque chose qui se passe. Essayez également, au lieu d'utiliser l'accesseur de propriété, 'junk.value (forProperty: la clé de date ajoutée)' et voyez ce que cela vous donne. Si c'est nul ou quelque chose de génial, vous avez peut-être trébuché dans un bug rapide. – hola

+0

Je ne vois pas de clé de date ajoutée en réalité. – hola

+0

J'espère que vous comprendre cela, bonne chance! – hola

Répondre

0

Semble la valeur NULL de dateAdded est mal annotées dans le courant iOS SDK, et vous pouvez avoir besoin d'solution de contournement.

Essayez cette extension:

extension MPMediaItem { 
    func getAddedDate() -> Date? { 
     return self.perform(#selector(getter: MPMediaItem.dateAdded))?.takeUnretainedValue() as! NSDate? as Date? 
    } 
} 

Et l'utiliser comme:

 if let dAdded = junk.getAddedDate() { 
      print("episode added date: \(dAdded)") 
     }else{ 
      print("episode added date is nil") 
     } 

Vous feriez mieux d'envoyer un rapport de bug à Apple sur cette question. (Il peut être classé comme doublon, mais le nombre peut affecter.)

+0

Merci, cela a fonctionné. Une chose à noter est que "dateAdded" est seulement disponible depuis iOS 10 donc j'ai dû enrouler la clause d'extension et mon utilisation comme suit: 'extension MPMediaItem { @available (iOS 10.0, *) func getAddedDate() -> Rendez-vous amoureux? { Renvoie self.perform (#selector (getter: MPMediaItem.dateAdded)). TakeUnretainedValue() as! NSDate? comme date? } } ' – wayneh

0

Après la dernière discussion, le dateAdded est de type non annulable et Date accident se produire quand il = nul.

Donc, je recommande ce type devrait Date? et vous devriez le déballer.

if let dAdded = junk.dateAdded { 
} 

ou de vérifier nil dans cette situation.

if junk.dateAdded != nil { 
} 
+0

dateAdded est tapé comme 'var dateAdded: Date {get}'. Le compilateur connaît le type. En outre ce n'est pas un type nullable, mais cela donne seulement un avertissement. – hola

+0

Est-ce qu'il s'est écrasé quand 'dateAdded = nil' juste à' let dAdded: Date = junk.dateAdded'? –

+0

Indépendamment des méthodes que j'utilise, il plante sur la ligne "let" ou "if". J'ai changé pour if junk.dateAdded! = Nil et le compilateur indique "Comparer la valeur non facultative du type 'Date' à zéro retourne toujours vrai" – wayneh