Попытка переопределить поддерживает безопасное кодирование, но не компилируется

Я конвертирую старый код в Swift 4, который использует SecureCoding. В документации Apple говорится, что это требование, однако мой код не компилируется. Я пытался изменить объявления между static, func, var и class, однако ни один из них не помог преобразовать в Swift 4.

Вот код, в котором я пытаюсь переопределить:

 override public class func supportsSecureCoding() -> Bool {
        return true
    }

Отображается ошибка, в которой говорится, что метод не переопределяет какой-либо метод из своего суперкласса. Справочный документ

Вот полный обновленный код, включающий решение:

import CareKit

public class ZCCareMonthlySchedule : OCKCareSchedule  {

    var calendar: NSCalendar?

    public class func monthlyScheduleWithStartDate(startDate: NSDateComponents,  occurrencesFromJanuaryToDecember: [NSNumber], monthsToSkip: UInt, endDate: NSDateComponents?) -> ZCCareMonthlySchedule? {

        guard occurrencesFromJanuaryToDecember.count == 12
            else { return nil}

        //TODO: Requires fixing after CareKit is updated to handle sub classes

//        let schedule = super.initWithStartDate(startDate: startDate, endDate: endDate, occurrences: occurrencesFromJanuaryToDecember, timeUnitsToSkip: monthsToSkip)




        return nil

    }



    override public var type: OCKCareScheduleType {
        return OCKCareScheduleType.other
    }



    override public func numberOfEvents(onDate date: DateComponents) -> UInt {

        calendar = NSCalendar.init(calendarIdentifier: NSCalendar.Identifier.gregorian)
        calendar!.timeZone = NSTimeZone(abbreviation: "UTC")! as TimeZone


        let startMonth = calendar?.ordinality(of: NSCalendar.Unit.month, in: NSCalendar.Unit.era, for: self.startDate.date! )
        let endMonth = calendar?.ordinality(of: NSCalendar.Unit.month, in: NSCalendar.Unit.era, for: date.date! )
        let monthsSinceStart = startMonth! - endMonth!
        let month = calendar?.component(NSCalendar.Unit.month, from: date.date!)

        //TODO:  Add a unit test to verify this works
        let occurrences : UInt = ((UInt(monthsSinceStart) % (self.timeUnitsToSkip + 1)) == 0) ? self.occurrences[month!-1].uintValue : 0;

        return occurrences;
    }



    //MARK: NSSecureCoding Support


    override public static var supportsSecureCoding: Bool{
        return true
    }

    required convenience public init?(coder aDecoder: NSCoder) {

        self.init(coder: aDecoder)

    }

    //MARK: NSCopying Support
    override public func copy(with zone: NSZone?) -> Any {

        let theCopy = super.copy(with: zone) as! ZCCareMonthlySchedule

        return theCopy
    }

}

person Laurence Wingo    schedule 08.10.2018    source источник
comment
Можете ли вы показать свой класс или объявление расширения, где вы принимаете протокол? Вы не используете override с принятием протокола. Это должно быть static var   -  person Paulw11    schedule 09.10.2018


Ответы (1)


Благодаря @Paulw11 ответ заключался в том, чтобы поместить это в переменную как статическую переменную, например следующее:

 override public static var supportsSecureCoding: Bool{
        return true
    }
person Laurence Wingo    schedule 09.10.2018