gpt4 book ai didi

ios - 检查值是否在数组中 - DatePicker Swift

转载 作者:行者123 更新时间:2023-11-29 00:50:26 26 4
gpt4 key购买 nike

我需要检查用户选择的时间是否在工作时间之外。我试图用 for in loopswitch 语句来实现这个结果,但我不确定如何实现它。如果 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-inswitch-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( _:) 以上。

从使用 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 控制语句的一些例子。但最后一个例子有点高级。

~= 运算符定义一个重载(读作“匹配”),在顶层某处(意味着在任何 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 语言的基础知识,您就有很多方法可以完成同样的事情。随心所欲。

关于ios - 检查值是否在数组中 - DatePicker Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38174851/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com