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

时间:2016-07-03 22:25:03

标签: ios arrays swift uidatepicker

我需要检查用户选择的小时数是否超出工作时间。 我试图用switchvar components语句来实现此结果,但我不确定如何实现它。 如果timeRestrictedclass 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") } } } } 数组中的值匹配,则它应该与switch语句断开。谢谢你的帮助。

OnHint

1 个答案:

答案 0 :(得分:1)

您的代码中存在一些误解。

首先,您的本地变量NSDateComponent中有components。使用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")
    }
}

好的,让我们看看其他一些方法。在这种情况下,一件重要的事情是您需要从日期hour中检索components值,因此,以下代码会替换上面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控制语句的一些示例。但最后一个例子有点先进。

~=运算符定义重载(读作"匹配"),位于顶层某处(意味着在任何class定义之外也不是这样)。

func ~= <T: Equatable>(lhs: [T], rhs: T) -> Bool {
    return lhs.contains(rhs)
}

在项目的某处定义此定义,您可以使用case语句的switch标签的数组变量或常量。

    switch hour {
    case timeRestricted:
        print("update label")
    default:
        print(" record input data and segue to next screen")
    }

在这种情况下,Swift使用~=运算符,因此,这与使用contains的第一个示例几乎相同。令人困惑,我不推荐。

只知道你可以检索hour作为Int,以及一些关于Swift语言的基础知识,你有很多方法可以做同样的事情。按你的意愿去做。