【问题标题】:switch and case statement is not working after updating from Swift 2.2从 Swift 2.2 更新后 switch 和 case 语句不起作用
【发布时间】:2017-06-21 11:53:09
【问题描述】:

我正在尝试使用 Swift 制作一个股票应用程序,但我遇到了 switch 和 case 语句的问题。它给了我一个错误,它希望我在案例中添加一个问号,因此它将读取案例 ?1 而不是案例 1,当我这样做时,它给了我 3 个错误,说明预期模式、预期表达式和预期':'在“案例”之后。任何帮助都会很棒。

func timeLabelsForTimeFrame(_ range: ChartTimeRange) -> [String] {

    switch range {
    case .oneDay:
        return ["9:30am", "10", "11", "12pm", "1", "2", "3", "4"]
    case .fiveDays:

        let weekday = (Calendar(identifier: 
Calendar.Identifier.gregorian) as NSCalendar).components(.weekday, 
from: Date()).weekday
        switch weekday {
        case 1:
        return ["Mon", "Tues", "Wed", "Thu", "Fri"]
        case 2:
        return ["Tues", "Wed", "Thu", "Fri", "Mon"]
        case 3:
        return ["Wed", "Thu", "Fri", "Mon", "Tues"]
        case 4:
        return ["Thu", "Fri", "Mon", "Tues", "Wed"]
        case 5:
        return ["Fri", "Mon", "Tues", "Wed", "Thu"]
        case 6:
        return ["Mon", "Tues", "Wed", "Thu", "Fri"]
        case 7:
        return ["Mon", "Tues", "Wed", "Thu", "Fri"]
        default: ()
        }
    case .tenDays:
        let weekday = (Calendar(identifier: Calendar.Identifier.gregorian) as NSCalendar).components(.weekday, from: Date()).weekday
        switch weekday {
        //sunday
        case 1:
        return ["Mon", "Wed", "Fri", "Mon", "Wed", "Fri"]
        case 2:
        return ["Wed", "Fri", "Mon", "Wed", "Fri", "Mon"]
        case 3:
        return ["Wed", "Fri", "Mon", "Wed", "Fri", "Tues"]
        case 4:
        return ["Fri", "Mon", "Wed", "Fri", "Mon", "Wed"]
        case 5:
        return ["Wed", "Mon", "Wed", "Fri", "Tues", "Thu"]
        case 6:
        return ["Mon", "Wed", "Fri", "Mon", "Wed", "Fri"]
        //saturday
        case 7:
        return ["Mon", "Wed", "Fri", "Mon", "Wed", "Fri"]
        default: ()
        }
    case .oneMonth:

        let fmt = DateFormatter()
        fmt.dateFormat = "dd MMM"
        let offset = Double(-6*24*60*60)
        let start = Date()
        let fifthString = fmt.string(from: start.addingTimeInterval(offset))
        let fourthString = fmt.string(from: start.addingTimeInterval(offset * 2))
        let thirdString = fmt.string(from: start.addingTimeInterval(offset * 3))
        let secondString = fmt.string(from: start.addingTimeInterval(offset * 4))
        let firstString = fmt.string(from: start.addingTimeInterval(offset * 5))

        return[firstString, secondString, thirdString, fourthString, fifthString, ""]
    case .threeMonths:
        let fmt = DateFormatter()
        fmt.dateFormat = "dd MMM"
        let offset = Double(-15*24*60*60)
        let start = Date()
        let fifthString = fmt.string(from: start.addingTimeInterval(offset))
        let fourthString = fmt.string(from: start.addingTimeInterval(offset * 2))
        let thirdString = fmt.string(from: start.addingTimeInterval(offset * 3))
        let secondString = fmt.string(from: start.addingTimeInterval(offset * 4))
        let firstString = fmt.string(from: start.addingTimeInterval(offset * 5))

        return[firstString, secondString, thirdString, fourthString, fifthString, ""]
    case .oneYear:
        let fmt = DateFormatter()
        fmt.dateFormat = "MMM"
        let offset = Double(-80*24*60*60)
        let start = Date()
        let fifthString = fmt.string(from: start.addingTimeInterval(offset))
        let fourthString = fmt.string(from: start.addingTimeInterval(offset * 2))
        let thirdString = fmt.string(from: start.addingTimeInterval(offset * 3))
        let secondString = fmt.string(from: start.addingTimeInterval(offset * 4))
        let firstString = fmt.string(from: start.addingTimeInterval(offset * 5))

        return[firstString, secondString, thirdString, fourthString, fifthString, ""]

    case .fiveYears:
        let fmt = DateFormatter()
        fmt.dateFormat = "yyyy"
        let offset = Double(-365*24*60*60)
        let start = Date()
        let fifthString = fmt.string(from: start.addingTimeInterval(offset))
        let fourthString = fmt.string(from: start.addingTimeInterval(offset * 2))
        let thirdString = fmt.string(from: start.addingTimeInterval(offset * 3))
        let secondString = fmt.string(from: start.addingTimeInterval(offset * 4))
        let firstString = fmt.string(from: start.addingTimeInterval(offset * 5))

        return[firstString, secondString, thirdString, fourthString, fifthString, ""]
    }
    return []

【问题讨论】:

    标签: ios swift swift3 switch-statement case


    【解决方案1】:

    在 Swift 2 中,NSDateComponents 中的日期组件是 表示为Int,未定义的组件被设置为特殊值NSDateComponentUndefined

    在 Swift 3 中,DateComponents 中的日期组件表示为 可选项 (Int?) 和未定义的组件是 nil

    所以你的代码中的weekday 是可选的,你需要解开它 (这是安全的,因为您请求了该组件):

    switch weekday! {
    case 1:
        // ...
    }
    

    或者你可以匹配“可选模式”:

    switch weekday {
    case 1?:
        // ...
    }
    

    (显然 Xcode "Fix-it" 不能正常工作,它提示 case ?1: 而不是 case 1?:。这发生在两个 Xcode 8 和 Xcode 9,看起来像一个错误。)

    然而,一个更简单的解决方案是使用 component(_:from:) Calendar的方法:

    let weekday = Calendar(identifier: .gregorian).component(.weekday, from: Date())
    

    它为您提供单个日期组件作为(非可选)Int。 请注意,不需要转换为 NSCalendar

    【讨论】:

      【解决方案2】:

      这里发生错误是因为变量 weekday 是一个可选变量,而您在 switch case 语句中使用了它。您可以为weekday 提供默认值,也可以在使用 switch case 语句之前强制解包。

      let weekday = (Calendar(identifier: Calendar.Identifier.gregorian) as NSCalendar).components(.weekday, from: Date()).weekday ?? 0
      

      在这里,您将0 作为默认值提供给weekday。或者你可以使用

      let weekday = (Calendar(identifier: Calendar.Identifier.gregorian) as NSCalendar).components(.weekday, from: Date()).weekday
         switch weekday! {
         case 1:
         .....
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多