2016-07-03 18 views
0

ユーザが選択した時間が勤務時間外であるかどうかを確認する必要があります。 for in loopswitchのステートメントでこの結果を達成しようとしていますが、これを実装する方法がわかりません。 var componentstimeRestricted配列の値と一致する場合は、switch文から壊れます。ご協力いただきありがとうございます。値が配列かどうかを確認する - 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") 
     } 



    } 

    } 

} 

答えて

1

コードにはいくつかの誤解があります。

まず、ローカル変数componentsNSDateComponentがあります。 for components in timeRestricted {...}を使用すると、別のローカル変数componentsが導入されます。これは意図したものではありません。

第2に、配列をcaseラベルとして使用することはできません。したがって、for-inswitch-caseの両方は、hourtimeRestrictedに含まれているかどうかのチェックには適していません。

このようなものにするために多分あなたの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") 
    } 
} 

[OK]を、のは、いくつかの他の方法を見てみましょう。この場合の重要な点の1つは、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") 
    } 

上記の二つの基本的なスイフト制御ステートメントを使用して、いくつかの例でした。しかし、最後の例は少し進んでいます。

~=演算子(「一致」と読みます)のオーバーロードを定義します。これは最上位レベル(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") 
    } 

、スウィフトはその~=演算子を使用するので、これは、containsを用いて実施例1とほぼ同じです。私はお勧めしないので、混乱している。ちょうどあなたがIntとしてhourを取得することができます知っている、とスウィフト言語に関するいくつかの基本は、あなたが同じことを行うには非常に多くの方法を持っていると


。あなたが好きなようにしてください。

+0

これは機能します。 inとswitchステートメントで同じ機能を実装する場合は、どうしますか?ありがとう – bibscy

+0

私は今のところ時間がありません、後で私の答えを更新します。 – OOPer