2016-10-18 2 views
2

J'ai des moments difficiles avec des trucs de protocole rapide 3. Mon problème est que quand j'ai ce protocole:SWFT 3 Protocole Déclarant tableau avec des éléments de type avec @objc

@objc 
protocol HHMapViewProtocol: class { 
    init() 
    func moveCamera(_ target: CLLocationCoordinate2D, zoom: Float, animated: Bool) -> Void 
    func moveCamera(_ target: CLLocationCoordinate2D, animated: Bool) -> Void 
    func positionCamera(on target: CLLocationCoordinate2D, facing at: CLLocationCoordinate2D, inDuration duration: CFTimeInterval) 
    func setWaypoints(_ waypoints: [CLLocationCoordinate2D]) 
} 

La dernière méthode dans ce protocole génère une erreur car:

Method cannot be a member of an @objc protocol because the type of 
the parameter cannot be represented in Objective-C 

Ce que je ne comprends pas, c'est pourquoi le problème est uniquement dans Array. Si je tape:

func setWaypoints(_ waypoints: [NSObject]) 

Ensuite tout va bien. Pourquoi CLLocationCoordinate2D dans d'autres fonctions n'est pas un problème et dans le cas de tableau est un problème? Quelqu'un peut-il donner une bonne solution du point de vue de l'API parce que je veux que ce tableau soit paramétré. Je sais que CLLocationCoordinate2D est une structure et ceci ne peut pas être représenté dans Objective-C mais le compilateur ne se plaint pas des fonctions moveCamera et positionCamera.

Répondre

0

CLLocationCoordinate2D est une structure (Objective-) C et peut sûrement être représentée dans (Objective-) C. Il est défini en utilisant ce langage.

NSArray, la classe utilisée pour représenter les tableaux d'objets dans Objective-C ne peut pas contenir de structures. On pourrait utiliser un tableau C dans Objective-C, mais Swift essaie d'utiliser une instance de NSArray et reconnaît que cela ne fonctionne pas.

Définissez un wrapper oop pour CLLocationCoordinate2D, utilisez NSValue ou créez un type pouvant contenir un tableau C. Le compilateur Swift le comprendra.