无法符合 Swift 中的 MKAnnotation 协议
Unable to conform MKAnnotation protocol in Swift
当我尝试遵循 MKAnnotation
协议时它抛出错误我的 class 不符合协议 MKAnnotation
。我正在使用以下代码
import MapKit
import Foundation
class MyAnnotation: NSObject, MKAnnotation
{
}
Objective-C也可以实现同样的效果。
您需要在调用中实现以下要求 属性:
class MyAnnotation: NSObject, MKAnnotation {
var myCoordinate: CLLocationCoordinate2D
init(myCoordinate: CLLocationCoordinate2D) {
self.myCoordinate = myCoordinate
}
var coordinate: CLLocationCoordinate2D {
return myCoordinate
}
}
在Swift中,您必须实现协议的每个非可选变量和方法才能符合协议。现在,您的 class 是空的,这意味着它现在不符合 MKAnnotation
协议。如果您查看 MKAnnotation
的声明:
protocol MKAnnotation : NSObjectProtocol {
// Center latitude and longitude of the annotation view.
// The implementation of this property must be KVO compliant.
var coordinate: CLLocationCoordinate2D { get }
// Title and subtitle for use by selection UI.
optional var title: String! { get }
optional var subtitle: String! { get }
// Called as a result of dragging an annotation view.
@availability(OSX, introduced=10.9)
optional func setCoordinate(newCoordinate: CLLocationCoordinate2D)
}
你可以看到,如果你至少实现了 coordinate
变量,那么你就符合协议。
这是一个更简单的版本:
class CustomAnnotation: NSObject, MKAnnotation {
init(coordinate:CLLocationCoordinate2D) {
self.coordinate = coordinate
super.init()
}
var coordinate: CLLocationCoordinate2D
}
您不需要将额外的 属性 var myCoordinate: CLLocationCoordinate2D
定义为已接受的答案。
或者(适用于 Swift 2.2,Xcode 7.3.1)(注意:Swift 不提供自动通知,因此我自己提供。)- -
import MapKit
class MyAnnotation: NSObject, MKAnnotation {
// MARK: - Required KVO-compliant Property
var coordinate: CLLocationCoordinate2D {
willSet(newCoordinate) {
let notification = NSNotification(name: "MyAnnotationWillSet", object: nil)
NSNotificationCenter.defaultCenter().postNotification(notification)
}
didSet {
let notification = NSNotification(name: "MyAnnotationDidSet", object: nil)
NSNotificationCenter.defaultCenter().postNotification(notification)
}
}
// MARK: - Required Initializer
init(coordinate: CLLocationCoordinate2D) {
self.coordinate = coordinate
}
当我尝试遵循 MKAnnotation
协议时它抛出错误我的 class 不符合协议 MKAnnotation
。我正在使用以下代码
import MapKit
import Foundation
class MyAnnotation: NSObject, MKAnnotation
{
}
Objective-C也可以实现同样的效果。
您需要在调用中实现以下要求 属性:
class MyAnnotation: NSObject, MKAnnotation {
var myCoordinate: CLLocationCoordinate2D
init(myCoordinate: CLLocationCoordinate2D) {
self.myCoordinate = myCoordinate
}
var coordinate: CLLocationCoordinate2D {
return myCoordinate
}
}
在Swift中,您必须实现协议的每个非可选变量和方法才能符合协议。现在,您的 class 是空的,这意味着它现在不符合 MKAnnotation
协议。如果您查看 MKAnnotation
的声明:
protocol MKAnnotation : NSObjectProtocol {
// Center latitude and longitude of the annotation view.
// The implementation of this property must be KVO compliant.
var coordinate: CLLocationCoordinate2D { get }
// Title and subtitle for use by selection UI.
optional var title: String! { get }
optional var subtitle: String! { get }
// Called as a result of dragging an annotation view.
@availability(OSX, introduced=10.9)
optional func setCoordinate(newCoordinate: CLLocationCoordinate2D)
}
你可以看到,如果你至少实现了 coordinate
变量,那么你就符合协议。
这是一个更简单的版本:
class CustomAnnotation: NSObject, MKAnnotation {
init(coordinate:CLLocationCoordinate2D) {
self.coordinate = coordinate
super.init()
}
var coordinate: CLLocationCoordinate2D
}
您不需要将额外的 属性 var myCoordinate: CLLocationCoordinate2D
定义为已接受的答案。
或者(适用于 Swift 2.2,Xcode 7.3.1)(注意:Swift 不提供自动通知,因此我自己提供。)- -
import MapKit
class MyAnnotation: NSObject, MKAnnotation {
// MARK: - Required KVO-compliant Property
var coordinate: CLLocationCoordinate2D {
willSet(newCoordinate) {
let notification = NSNotification(name: "MyAnnotationWillSet", object: nil)
NSNotificationCenter.defaultCenter().postNotification(notification)
}
didSet {
let notification = NSNotification(name: "MyAnnotationDidSet", object: nil)
NSNotificationCenter.defaultCenter().postNotification(notification)
}
}
// MARK: - Required Initializer
init(coordinate: CLLocationCoordinate2D) {
self.coordinate = coordinate
}