Тип "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}

Надеюсь, что это слишком многое прояснит.