簡體   English   中英

從Swift 2.2更新后,switch和case語句不起作用

[英]switch and case statement is not working after updating from Swift 2.2

我正在嘗試使用Swift創建一個股票應用程序,但是我在開關和案例說明上遇到了問題。 它給我一個錯誤,要求我在案例中添加一個問號,以便它讀取案例?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 []

在這里發生錯誤是因為變量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:
   .....
}

在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中都發生,並且看起來像個bug。)

但是,一個更簡單的解決方案是使用Calendarcomponent(_:from:)方法:

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

它為您提供一個單一的日期成分,作為(非可選) Int 請注意,不需要NSCalendarNSCalendar

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM