-1

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

    }
}

错误:

截屏

4

2 回答 2

1

您的方法已定义为返回 a 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
    }
}   
于 2019-02-12T15:22:45.473 回答
0

您的函数声称返回 a CLKComplicationTemplate,因此在所有情况下它都必须这样做,否则它无法返回。如果在任何情况下不可能返回您承诺的类型的值,您唯一的其他合理选择是使程序崩溃,最常见的是调用fatalError. (从技术上讲,您也可以阻止该函数,使其永远不会返回,例如通过进入无限循环,但这通常不是一个有用的解决方案。)

这为您留下了许多前进的选择:

  • 如果有一些合理的默认值,您可以将其返回以处理未处理的复杂情况。
  • 如果您认为将无效的复杂性传递给此函数是编程错误,那么fatalError()在这些情况下调用是合理的。例如,访问超出其边界的数组索引是一个编程错误,并且以这种方式使程序崩溃。您永远不应该这样做以响应来自系统外部的数据(例如配置数据)。
  • 您可以更改此方法以接受仅包含您支持的案例的枚举,而不是传递整个复杂性。这使得错误地调用它是不可能的,并且通常比调用更可取fatalError
  • 如果传递无效的并发症是可以接受的,但不应该做任何事情,那么您应该更改返回方法CLKComplicationTemplate?并让调用者决定如何处理它。例如,如果你调用.first一个空数组,你会得到 nil。这不是错误;只是没有这样的元素。
  • 如果传递无效的并发症是错误,但应该由调用者处理(例如,如果它来自配置数据),那么您应该更改此方法以throws在这些情况下添加并抛出错误。例如,尝试打开不存在的文件会引发错误。这是错误的,但这不是编程错误。如果您希望调用者了解出了什么问题,这将特别有用。您可以认为throws将承诺的返回类型更改为“返回值或抛出的错误”。
于 2019-02-12T15:33:24.323 回答