Swft 3协议声明带有@objc

时间:2016-10-18 15:13:45

标签: objective-c swift3 swift-protocols

我在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。

1 个答案:

答案 0 :(得分:0)

CLLocationCoordinate2D是一个(Objective-)C-struct,可以用(Objective-)C表示。它是使用该语言定义的。

NSArray,用于在Objective-C中表示对象数组的类,不能包含结构。可以在Objective-C中使用C数组,但是Swift尝试使用NSArray的实例并认识到这不起作用。

CLLocationCoordinate2D定义oop包装,使用NSValue,或者克服一个可以包含C数组的类型。 Swift编译器会理解这一点。