Тип "title" имеет разную опциональность, чем требуется по протоколу "MKAnnotation"
Я последовал за учебником MapKit Ray Wenderlich в быстром: http://www.raywenderlich.com/90971/introduction-mapkit-swift-tutorial, и когда я создал класс Artwork, я получил ошибку, написанную в названии. Я не знаю, что мне делать.
Это код:
class Artwork: NSObject, MKAnnotation {
let title: String
let locationName: String
let discipline: String
let coordinate: CLLocationCoordinate2D
init(title: String, locationName: String, discipline: String, coordinate: CLLocationCoordinate2D) {
self.title = title
self.locationName = locationName
self.discipline = discipline
self.coordinate = coordinate
super.init()
}
}
Пожалуйста, помогите!
Ответы
Ответ 1
Ансер находится в документации: на странице MKAnnotation protocol reference отображается, что свойство title
должно быть необязательным.
Это именно то, что вам сообщает сообщение об ошибке: необязательность title
неверна.
Измените его соответствующим образом:
class Artwork: NSObject, MKAnnotation {
var title: String?
let locationName: String
let discipline: String
let coordinate: CLLocationCoordinate2D
init(title: String, locationName: String, discipline: String, coordinate: CLLocationCoordinate2D) {
self.title = title
self.locationName = locationName
self.discipline = discipline
self.coordinate = coordinate
super.init()
}
}
ProTip: в Xcode, CMD + CLICK для вашего объекта или определения (MKAnnotation
в вашем случае), чтобы узнать, как протокол объявлен и каковы его требования.
Ответ 2
Для протокола MKAnnation требуется, чтобы название было необязательным типом:
public protocol MKAnnotation : NSObjectProtocol {
// Center latitude and longitude of the annotation view.
// The implementation of this property must be KVO compliant.
public var coordinate: CLLocationCoordinate2D { get }
// Title and subtitle for use by selection UI.
optional public var title: String? { get }
optional public var subtitle: String? { get }
}
Просто объявите переменную title как: let title: String?
, и проблема исчезнет.
Ответ 3
Измените его соответствующим образом:
var title: String?
var subtitle: String?
Ответ 4
С учетом вышеизложенного
с 2016 года стремительно 3
если вы следуете приведенному выше руководству, вам необходимо обратиться к: var subtitle: String { return locationName}
: public var subtitle: String? { return locationName}
Надеюсь, что это слишком многое прояснит.