我在swift 3中遇到一些协议问题很困难。我的问题是,当我有这个协议时:
@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])
}
此协议中的最后一个方法是生成错误,因为:
Method cannot be a member of an @objc protocol because the type of
the parameter cannot be represented in Objective-C
我不明白为什么问题只出现在Array中。如果我输入:
func setWaypoints(_ waypoints: [NSObject])
然后一切都好。为什么CLLocationCoordinate2D在其他函数中不是问题而在数组中是一个问题?有人可以从API的角度给出一些很好的解决方案,因为我希望这个数组应该是参数化的。我知道CLLocationCoordinate2D是一个结构,这不能用Objective-C表示,但编译器不会抱怨moveCamera函数和positionCamera。
答案 0 :(得分:0)
CLLocationCoordinate2D
是一个(Objective-)C-struct,可以用(Objective-)C表示。它是使用该语言定义的。
NSArray
,用于在Objective-C中表示对象数组的类,不能包含结构。可以在Objective-C中使用C数组,但是Swift尝试使用NSArray
的实例并认识到这不起作用。
为CLLocationCoordinate2D
定义oop包装,使用NSValue
,或者克服一个可以包含C数组的类型。 Swift编译器会理解这一点。