2017-08-04 1 views
0

Je continue à recevoir cette erreur lorsque j'exécute mon projet dans le simulateur. Cela se produit uniquement dans le simulateur xcode. Quand je lance le projet sur mon téléphone, il semble fonctionner parfaitement.Erreur CLLocationCoordinate2D lors de l'exécution dans Simulator Swift

Voici mon code suivant:

extension QuadTreeNode: AnnotationsContainer { 

@discardableResult 
func add(_ annotation: MKAnnotation) -> Bool { 
    guard rect.contains(annotation.coordinate) else { return false } 

    switch type { 
    case .leaf: 
     annotations.append(annotation) 
     // if the max capacity was reached, become an internal node 
     if annotations.count == QuadTreeNode.maxPointCapacity { 
      subdivide() 
     } 
    case .internal(let children): 
     // pass the point to one of the children 
     for child in children where child.add(annotation) { 
      return true 
     } 

     fatalError("rect.contains evaluted to true, but none of the children added the annotation") 
    } 
    return true 
} 

@discardableResult 
func remove(_ annotation: MKAnnotation) -> Bool { 
    guard rect.contains(annotation.coordinate) else { return false } 

    _ = annotations.map { $0.coordinate }.index(of: annotation.coordinate).map { annotations.remove(at: $0) } 

    switch type { 
    case .leaf: break 
    case .internal(let children): 
     // pass the point to one of the children 
     for child in children where child.remove(annotation) { 
      return true 
     } 

     fatalError("rect.contains evaluted to true, but none of the children removed the annotation") 
    } 
    return true 
} 

private func subdivide() { 
    switch type { 
    case .leaf: 
     type = .internal(children: Children(parentNode: self)) 
    case .internal: 
     preconditionFailure("Calling subdivide on an internal node") 
    } 
} 

func annotations(in rect: MKMapRect) -> [MKAnnotation] { 

    // if the node's rect and the given rect don't intersect, return an empty array, 
    // because there can't be any points that lie the node's (or its children's) rect and 
    // in the given rect 
    guard self.rect.intersects(rect) else { return [] } 

    var result = [MKAnnotation]() 

    // collect the node's points that lie in the rect 
    for annotation in annotations where rect.contains(annotation.coordinate) { 
     result.append(annotation) 
    } 

    switch type { 
    case .leaf: break 
    case .internal(let children): 
     // recursively add children's points that lie in the rect 
     for childNode in children { 
      result.append(contentsOf: childNode.annotations(in: rect)) 
     } 
    } 

    return result 
} 
} 

L'erreur semble se produire lorsque cette ligne est invoquée dans le code:

_ = annotations.map { $0.coordinate }.index(of: annotation.coordinate).map { annotations.remove(at: $0) } 

L'erreur que je me lit: ne peut pas invoquer « index » avec liste d'arguments de type '(de: CLLocationCoodinate2D)'

Vous ne savez pas pourquoi je reçois cette erreur uniquement dans le simulateur.

+0

Honnêtement, je ne sais pas, mais le simulateur peut-il utiliser CoreLocation? Je pense peut-être pas. – dfd

+0

Oui, vous pouvez simuler l'emplacement en utilisant Xcode. La chose étrange est, cela me semble un message d'erreur de compilation et pas la description d'une erreur d'exécution ... –

+0

Cela ne devrait pas fonctionner sur votre téléphone ou le simulateur puisque 'CLLocationCoordinate2D's ne sont pas 'Equatable' – dan

Répondre

0

Dans ce

_ = annotations.map { $0.coordinate }.index(of: annotation.coordinate) 

Qu'est-ce que les annotations contiennent ?. Je suppose que annotations.map { $0.coordinate } ne retourne pas un tableau de CLLocationCoodinate2D pour une raison quelconque. Parce que l'erreur indique cela.

quelque chose comme assign

coordinates = annotations.map { $0.coordinate } 

Et vous vous rendrez compte que les coordonnées ne sont pas un tableau de CLLocationCoodinate2D c'est pourquoi vous n'êtes pas autorisé à appeler l'index (de:) sur ce tableau.

+0

Je crois que mon code est correct et correct. Il fonctionne parfaitement sur mon iPhone mais pour une raison quelconque, il ne fonctionne pas sur mon simulateur sur mon ordinateur portable. Une raison pour laquelle cela pourrait être? – ajayb

+0

Du message d'erreur, je peux deviner que seulement. Pouvez-vous s'il vous plaît définir les coordonnées de la façon dont j'ai fait et vérifier ce qu'il obtient. Je suis sûr que ce n'est pas un tableau de CLLocationCoodinate2D. Pouvez-vous s'il vous plaît laissez-moi savoir le type d'annotations? Quelles annotations contiennent ici. –