[英]Class protocols not working after updating from Swift 2.3 to Swift 3.0
[英]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。)
但是,一個更簡單的解決方案是使用Calendar
的component(_:from:)
方法:
let weekday = Calendar(identifier: .gregorian).component(.weekday, from: Date())
它為您提供一個單一的日期成分,作為(非可選) Int
。 請注意,不需要NSCalendar
為NSCalendar
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.