2016-07-03 3 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이 생기고, 이것은 의도 한 것과 다를 수 있습니다.

두 번째로 배열을 case 라벨로 사용할 수 없습니다. 따라서 및 switch-casehourtimeRestricted에 포함되어 있는지 확인하기에 적합하지 않습니다.

어쩌면 당신의 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") 
    } 

상기 기본 신속한 제어 명령을 사용하는 일부 실시 예였다. 그러나 마지막 예제는 약간 향상되었습니다.

~= 연산자의 오버로드 ("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") 
    } 

는 스위프트 ~= 연산자이므로,이 contains를 사용하여 첫 번째 예와 거의 동일한 것을 사용한다. 혼란 스럽기 때문에 추천하지 않습니다.당신이 Inthour를 검색 할 수 있습니다 알고, 그리고 스위프트 언어에 대한 몇 가지 기본 사항, 당신은 같은 일을 할 수있는 많은 방법을 가지고와


. 원하는대로해라.

+0

작동합니다. in 및 switch 문을 사용하여 동일한 기능을 구현한다면 어떻게 할 것입니까? 감사합니다 – bibscy

+0

지금은 시간이 없어 나중에 내 대답을 업데이트 할 것입니다. – OOPer

관련 문제