簡體   English   中英

檢查值是否在數組中-DatePicker Swift

[英]Check if value is in array - DatePicker Swift

我需要檢查用戶選擇的時間是否在工作時間之外。 我正在嘗試使用for in loopswitch語句來實現此結果,但是我不確定如何實現這一點。 如果var componentstimeRestricted數組中的值匹配,則應從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 {...}使用for components in timeRestricted {...}引入了另一個局部變量components ,這不是您想要的。

其次,不能將數組用作case標簽。 因此, for-inswitch-case都不適合檢查timeRestricted是否包含一個hour

也許您的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的第一個示例幾乎相同。 如此混亂,我不推薦。


僅僅知道您可以將Int檢索為hour ,並獲得了一些有關Swift語言的基礎知識,您就擁有了完成同一件事的多種方法。 隨心所欲。

暫無
暫無

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

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