Я не знаю, что будет возвращаемое значение Swift - PullRequest
0 голосов
/ 12 февраля 2019

Xcode говорит, что нужно ввести возвращаемое значение, но я понятия не имею, какое возвращаемое значение использовать.

func getCurrentTimelineEntry(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimelineEntry?) -> Void) {
    let entry = CLKComplicationTimelineEntry(date: Date(), complicationTemplate: constructTemplate(for: complication))
    handler(entry)
}

func getLocalizableSampleTemplate(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTemplate?) -> Void) {
    handler(constructTemplate(for: complication))
}

private func constructTemplate(for complication: CLKComplication) -> CLKComplicationTemplate {
    switch complication.family {
        case .modularSmall:
            let template = CLKComplicationTemplateModularSmallSimpleText()
            let provider = CLKSimpleTextProvider(text: GioTexts.TitleLeft.rawValue)
            template.textProvider = provider

            return template
        case .modularLarge:
            let t = CLKComplicationTemplateModularLargeStandardBody()
            t.headerImageProvider = CLKImageProvider(onePieceImage: UIImage(named: "Complication/Circular")!)
            t.headerTextProvider = CLKSimpleTextProvider(text: GioTexts.TitleLeft.rawValue)
            t.body1TextProvider = CLKSimpleTextProvider(text: GioTexts.SubtitleLeft.rawValue)
            t.body2TextProvider = CLKSimpleTextProvider(text: GioTexts.SubtitleRight.rawValue)
            return t
        case .extraLarge:
            let t = CLKComplicationTemplateExtraLargeColumnsText()
            t.row1Column2TextProvider = CLKSimpleTextProvider(text: GioTexts.TitleLeft.rawValue)
            t.row1Column1TextProvider = CLKSimpleTextProvider(text: "")
            t.row2Column2TextProvider = CLKSimpleTextProvider(text: GioTexts.SubtitleLeft.rawValue)
            t.row2Column1TextProvider = CLKSimpleTextProvider(text: GioTexts.SubtitleRight.rawValue)
            t.column2Alignment = .trailing
            return t
        case .utilitarianSmallFlat, .utilitarianSmall:
            let t = CLKComplicationTemplateUtilitarianSmallFlat()
            t.imageProvider = CLKImageProvider(onePieceImage: UIImage(named: "Complication/Circular")!)
            t.textProvider = CLKSimpleTextProvider(text: GioTexts.TitleLeft.rawValue)
            return t
        case .utilitarianLarge:
            let t = CLKComplicationTemplateUtilitarianLargeFlat()
            t.textProvider = CLKSimpleTextProvider(text: GioTexts.TitleLeft.rawValue)
            return t
        case .circularSmall:
            let t = CLKComplicationTemplateCircularSmallStackImage()
            t.line1ImageProvider = CLKImageProvider(onePieceImage: UIImage(named: "Complication/Circular")!)
            t.line2TextProvider = CLKSimpleTextProvider(text: GioTexts.TitleLeft.rawValue)
            return t
        case .graphicCorner: break
        case .graphicBezel: break
        case .graphicCircular: break
        case .graphicRectangular: break

    }
}

Ошибка:

screenshot

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Ваша функция утверждает, что возвращает CLKComplicationTemplate, поэтому во всех случаях она должна делать это, иначе она не может вернуться.Если есть какие-либо случаи, когда невозможно вернуть значение того типа, который вы обещали, ваш единственный разумный вариант - завершить работу программы, чаще всего вызывая fatalError.(Технически вы также можете заблокировать функцию, чтобы она никогда не возвращалась, например, введя бесконечный цикл, но это, как правило, бесполезное решение.)

Это оставляет вам много вариантов того, как двигаться вперед:

  • Если есть какое-то разумное значение по умолчанию, вы можете вернуть его для необработанных осложнений.
  • Если вы считаете передачу недопустимых осложнений этой функции ошибкой программирования, то эторазумно назвать fatalError() в этих случаях.Например, доступ к индексу массива за его пределами является ошибкой программирования и приводит к аварийному завершению программы.Вы никогда не должны делать это в ответ на данные, поступающие извне системы (например, данные конфигурации).
  • Вы можете изменить этот метод, чтобы принимать перечисление, которое просто включает в себя поддерживаемые вами случаи, вместо того, чтобы передавать всеосложнение.Это делает неправильный вызов невозможным, и, как правило, предпочтительнее вызова fatalError.
  • Если допустимо передать недопустимое осложнение, но ничего не делать, то вы должны изменить метод, чтобы он возвратил CLKComplicationTemplate? и позволитьзвонящий решает, что с этим делать.Например, если вы вызовете .first для пустого массива, вы получите nil.Это не ошибка;такого элемента просто нет.
  • Если передача недопустимого усложнения является ошибкой, но она должна быть обработана вызывающей стороной (например, если это происходит из данных конфигурации), то вам следует изменить этот метод, добавив throws и выкинуть ошибку в тех случаях.Например, попытка открыть файл, который не существует, приводит к ошибке.Это неправильно, но это не ошибка программирования.Это особенно полезно, если вы хотите, чтобы звонящий понимал, что пошло не так.Вы можете думать о throws как об изменении обещанного типа возвращаемого значения на «либо возвращаемое значение, либо выданная ошибка».
0 голосов
/ 12 февраля 2019

Ваш метод был определен так, чтобы возвращать CLKComplicationTemplate, но последние четыре case предложения просто break, ничего не возвращая.

Поскольку все методы CLKComplicationDataSource, использующие этот служебный метод, принимают опциональные значения, вы должны просто определить этот метод, чтобы он возвращал необязательный (т. Е. CLKComplicationTemplate?), и эти четыре случая возвращают nil:

func getCurrentTimelineEntry(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimelineEntry?) -> Void) {
    let entry = constructTemplate(for: complication).flatMap {
        CLKComplicationTimelineEntry(date: Date(), complicationTemplate: $0)
    }
    handler(entry)
}

func getLocalizableSampleTemplate(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTemplate?) -> Void) {
    handler(constructTemplate(for: complication))
}

private func constructTemplate(for complication: CLKComplication) -> CLKComplicationTemplate? {
    switch complication.family {
        case .modularSmall:
            ...
        case .modularLarge:
            ...
        case .extraLarge:
            ...
        case .utilitarianSmallFlat, .utilitarianSmall:
            ...
        case .utilitarianLarge:
            ...
        case .circularSmall:
            ...
        case default:
            return nil
    }
}   
...