2016-07-03 11 views
0

Ich muss überprüfen, ob die vom Benutzer gewählte Stunde außerhalb der Arbeitszeit liegt. Ich versuche, dieses Ergebnis mit einer for in loop und switch Aussage zu erreichen, aber ich bin mir nicht sicher, wie man das umsetzt. Wenn var components mit einem Wert im Array timeRestricted übereinstimmt, sollte es von der switch-Anweisung abweichen. Danke für Ihre Hilfe.Überprüfen, ob der Wert im Array ist - DatePicker Swift

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") 
     } 



    } 

    } 

} 

Antwort

1

Sie haben mehrere Missverständnisse in Ihrem Code.

Zuerst haben Sie eine NSDateComponent in Ihrer lokalen Variablen components. Mit for components in timeRestricted {...} wird eine andere lokale Variable components eingeführt, die nicht das ist, was Sie beabsichtigen.

Zweitens kann Array nicht als case Label verwendet werden. Sowohl for-in als auch switch-case passen nicht zur Prüfung, ob ein hour im timeRestricted enthalten ist.

Vielleicht ist Ihr datePickerAction Bedürfnisse, so etwas sein:

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") 
    } 
} 

Ok, lassen Sie uns einige andere Möglichkeiten sehen. Eine wichtige Sache in diesem Fall ist, dass Sie hour Wert vom Datum components abrufen müssen, so ersetzen die folgenden Codes die letzten 5 Zeilen meiner datePickerAction(_:) oben.

Beginnen Sie mit der Verwendung 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") 
    } 

Dieser Code ist sehr ähnlich zu dem, was contains(_:) Methode intern tut. Und Sie wissen, die for-in Syntax führt eine neue Variable ein. Sie sollten besser vermeiden, denselben Namen wie die vorhandenen Variablen zu verwenden. Was viele Leser Ihres Codes verwirrt, einschließlich Sie selbst.


switch-case nutzen zu können, müssen Sie alle kommagetrennte Werte direkt nach dem case Schlüsselwort schreiben.

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") 
    } 

Die beiden oben genannten waren einige Beispiele grundlegende Swift-Steueranweisungen verwendet. Aber das letzte Beispiel ist ein bisschen fortgeschritten.

Definieren Sie eine Überlastung für ~= Operator (lesen Sie als "Übereinstimmungen"), irgendwo auf der obersten Ebene (dh außerhalb von class Definitionen noch solche).

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

diese Definition irgendwo in Ihrem Projekt haben, können Sie Array-Variablen oder Konstanten für case Label switch Anweisung verwenden.

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

In diesem Fall verwendet Swift dass ~= Operator, so, dies mit contains fast das gleiche wie das erste Beispiel ist. So verwirrend das ich es nicht empfehlen würde.


Mit nur wissen Sie hour als Int und einige Grundlagen über Swift Sprache abrufen können, haben Sie so viele Möglichkeiten, um das Gleiche zu tun. Mach es so, wie du willst.

+0

Es funktioniert. Wenn Sie die gleiche Funktionalität mit einer For- und Switch-Anweisung implementieren würden, wie würden Sie das tun? Danke – bibscy

+0

Ich habe keine Zeit für jetzt, werde meine Antwort später aktualisieren. – OOPer