【发布时间】:2014-07-30 14:29:09
【问题描述】:
我想实现我的自定义 MKAnnotation。我看了一下 MKAnnotation 协议(MKAnnotation.h)。 如下:
//
// MKAnnotation.h
// MapKit
//
// Copyright (c) 2009-2014, Apple Inc. All rights reserved.
//
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.
@optional func setCoordinate(newCoordinate: CLLocationCoordinate2D)
}
请注意坐标属性(这是一个只读存储属性)。 以下是我实现此协议的方式:
class RWDefaultPin: NSObject, MKAnnotation {
var title:String = ""
var subtitle:String = ""
var groupTag:String = ""
var coordinate: CLLocationCoordinate2D { get {
return self.coordinate // this is obviously wrong because property's trying to return itself
} };
init(coordinate:CLLocationCoordinate2D) {
super.init()
self.coordinate = coordinate
}
}
但显然编译器抱怨我的 init 方法,我试图分配给我的坐标属性 Cannot assign to 'coordinate' in 'self' 显然是因为它是一个只读属性。
以前在 Objective-C 中,我们可以克服这个问题,因为属性由 ivars 支持。
我希望 Swift 中有访问修饰符,这样我就可以在我的类中定义一个私有属性并在 init 上设置它的值,并在 get 坐标操作时返回它的值,但是没有这样的东西!
我不知道如何在 Swift 中解决此问题,或者我需要将其完全打开并将我的坐标更改为可读/可写?
【问题讨论】:
-
您是否尝试创建一个真正私有的
coordinate属性?一个可以在初始化时设置,是公共coordinategetter返回的值? -
为什么不给它添加一个
set? -
@Firo,这个属性曾经在 Objective-C 中是只读的,如果你注意到,苹果在 MKAnnotation.h 中将它定义为只读(变量坐标:CLLocationCoordinate2D { get })
-
@CjCoax 并不意味着你的班级可以给它一个二传手。只是意味着协议不会强制执行 setter,它会阻止不知道实际类的任何人设置属性。
-
@CjCoax,我犯了一个错误。显然你不能按照我的建议去做。在 setter 中设置属性实际上会陷入无限循环(因为现在已设置,所以它会再次调用 setter)。对不起。见编辑。
标签: swift