检查值是否在数组中 - DatePicker Swift
Check if value is in array - DatePicker Swift
我需要检查用户选择的时间是否在工作时间之外。
我试图通过 for in loop
和 switch
语句实现此结果,但我不确定如何实现它。
如果 var components
匹配 timeRestricted
数组中的值,它应该从 switch 语句中断。感谢您的帮助。
class FourthViewController: UIViewController {
@IBOutlet weak var myDatePicker: UIDatePicker!
var currentTime = NSDate()
let timeRestricted = [00,01,02,03,04,05,06,19,20,21,22,23]
var dateComponents = NSDateComponents()
var dateFormatter:NSDateFormatter = NSDateFormatter()
@IBOutlet weak var someLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm"
// load current time as minimum date
self.myDatePicker.minimumDate = NSDate(timeInterval: 1, sinceDate: currentTime)
myDatePicker.addTarget(self, action: #selector(self.datePickerAction(_:)), forControlEvents: UIControlEvents.ValueChanged)
}
func datePickerAction(sender: UIDatePicker) {
var timeSelected = sender.date
var unitFlags: NSCalendarUnit = [.Hour]
var components = NSCalendar.currentCalendar().components(unitFlags, fromDate: timeSelected)
for components in timeRestricted {
switch components {
case timeRestricted[0...12]: print("update label")
default: print(" record input data and segue to next screen")
}
}
}
}
你的代码有几个误区。
首先,您的局部变量 components
中有一个 NSDateComponent
。使用 for components in timeRestricted {...}
引入了另一个局部变量 components
,这不是您想要的。
其次,您不能将数组用作 case
标签。因此,for-in
和 switch-case
都不适合检查 hour
是否包含在 timeRestricted
.
中
也许您的 datePickerAction
需要是这样的:
func datePickerAction(sender: UIDatePicker) {
let timeSelected = sender.date
let unitFlags: NSCalendarUnit = [.Hour]
let components = NSCalendar.currentCalendar().components(unitFlags, fromDate: timeSelected)
let hour = components.hour
if timeRestricted.contains(hour) {
print("update label")
} else {
print(" record input data and segue to next screen")
}
}
好的,让我们看看其他一些方法。在这种情况下,一件重要的事情是您需要从日期 components
检索 hour
值,因此,以下代码替换了我上面 datePickerAction(_:)
的最后 5 行。
开始使用 for-in
。
var isInArray = false
for restrictedHour in timeRestricted {
if hour == restrictedHour {
isInArray = true
//We have no need to check the rest...
break
}
}
if isInArray {
print("update label")
} else {
print(" record input data and segue to next screen")
}
此代码与 contains(_:)
方法在内部执行的操作非常相似。
而且,您知道,for-in
语法引入了一个新变量。您最好避免使用与任何现有变量相同的名称。这让您代码的许多读者感到困惑,包括您自己。
要使用switch-case
,您需要在case
关键字后直接写入所有逗号分隔值。
switch hour {
case 00,01,02,03,04,05,06,19,20,21,22,23:
print("update label")
default:
print(" record input data and segue to next screen")
}
以上两个是使用基本 Swift 控制语句的一些示例。但是最后一个例子有点高级。
为 ~=
运算符(读作 "matches")定义一个重载,在顶层某处(意味着在任何 class
定义之外)。
func ~= <T: Equatable>(lhs: [T], rhs: T) -> Bool {
return lhs.contains(rhs)
}
在您的项目中的某处定义此定义,您可以将数组变量或常量用于 switch
语句的 case
标签。
switch hour {
case timeRestricted:
print("update label")
default:
print(" record input data and segue to next screen")
}
在这种情况下,Swift 使用 ~=
运算符,因此,这与使用 contains
的第一个示例几乎相同。太混乱了,我不推荐。
只要知道您可以将 hour
检索为 Int
,以及关于 Swift 语言的一些基础知识,您就有很多方法可以做同样的事情。随心所欲
我需要检查用户选择的时间是否在工作时间之外。
我试图通过 for in loop
和 switch
语句实现此结果,但我不确定如何实现它。
如果 var components
匹配 timeRestricted
数组中的值,它应该从 switch 语句中断。感谢您的帮助。
class FourthViewController: UIViewController {
@IBOutlet weak var myDatePicker: UIDatePicker!
var currentTime = NSDate()
let timeRestricted = [00,01,02,03,04,05,06,19,20,21,22,23]
var dateComponents = NSDateComponents()
var dateFormatter:NSDateFormatter = NSDateFormatter()
@IBOutlet weak var someLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm"
// load current time as minimum date
self.myDatePicker.minimumDate = NSDate(timeInterval: 1, sinceDate: currentTime)
myDatePicker.addTarget(self, action: #selector(self.datePickerAction(_:)), forControlEvents: UIControlEvents.ValueChanged)
}
func datePickerAction(sender: UIDatePicker) {
var timeSelected = sender.date
var unitFlags: NSCalendarUnit = [.Hour]
var components = NSCalendar.currentCalendar().components(unitFlags, fromDate: timeSelected)
for components in timeRestricted {
switch components {
case timeRestricted[0...12]: print("update label")
default: print(" record input data and segue to next screen")
}
}
}
}
你的代码有几个误区。
首先,您的局部变量 components
中有一个 NSDateComponent
。使用 for components in timeRestricted {...}
引入了另一个局部变量 components
,这不是您想要的。
其次,您不能将数组用作 case
标签。因此,for-in
和 switch-case
都不适合检查 hour
是否包含在 timeRestricted
.
也许您的 datePickerAction
需要是这样的:
func datePickerAction(sender: UIDatePicker) {
let timeSelected = sender.date
let unitFlags: NSCalendarUnit = [.Hour]
let components = NSCalendar.currentCalendar().components(unitFlags, fromDate: timeSelected)
let hour = components.hour
if timeRestricted.contains(hour) {
print("update label")
} else {
print(" record input data and segue to next screen")
}
}
好的,让我们看看其他一些方法。在这种情况下,一件重要的事情是您需要从日期 components
检索 hour
值,因此,以下代码替换了我上面 datePickerAction(_:)
的最后 5 行。
开始使用 for-in
。
var isInArray = false
for restrictedHour in timeRestricted {
if hour == restrictedHour {
isInArray = true
//We have no need to check the rest...
break
}
}
if isInArray {
print("update label")
} else {
print(" record input data and segue to next screen")
}
此代码与 contains(_:)
方法在内部执行的操作非常相似。
而且,您知道,for-in
语法引入了一个新变量。您最好避免使用与任何现有变量相同的名称。这让您代码的许多读者感到困惑,包括您自己。
要使用switch-case
,您需要在case
关键字后直接写入所有逗号分隔值。
switch hour {
case 00,01,02,03,04,05,06,19,20,21,22,23:
print("update label")
default:
print(" record input data and segue to next screen")
}
以上两个是使用基本 Swift 控制语句的一些示例。但是最后一个例子有点高级。
为 ~=
运算符(读作 "matches")定义一个重载,在顶层某处(意味着在任何 class
定义之外)。
func ~= <T: Equatable>(lhs: [T], rhs: T) -> Bool {
return lhs.contains(rhs)
}
在您的项目中的某处定义此定义,您可以将数组变量或常量用于 switch
语句的 case
标签。
switch hour {
case timeRestricted:
print("update label")
default:
print(" record input data and segue to next screen")
}
在这种情况下,Swift 使用 ~=
运算符,因此,这与使用 contains
的第一个示例几乎相同。太混乱了,我不推荐。
只要知道您可以将 hour
检索为 Int
,以及关于 Swift 语言的一些基础知识,您就有很多方法可以做同样的事情。随心所欲