[ios] 스위프트-Int를 enum : Int로 캐스팅

Swift를 처음 접했고 (이번 주에 시작) Objective-C에서 내 앱을 마이그레이션하고 있습니다. 기본적으로 Objective-C에 다음 코드가 제대로 작동합니다.

typedef enum : int {
    MyTimeFilter1Hour = 1,
    MyTimeFilter1Day = 2,
    MyTimeFilter7Day = 3,
    MyTimeFilter1Month = 4,
} MyTimeFilter;

...

- (void)selectFilter:(id)sender
{
    self.timeFilterSelected = (MyTimeFilter)((UIButton *)sender).tag;
    [self closeAnimated:YES];
}

Swift로 번역 할 때 다음을 수행했습니다.

enum MyTimeFilter : Int {
    case OneHour = 1
    case OneDay = 2
    case SevenDays = 3
    case OneMonth = 4
}

...

@IBAction func selectFilter(sender: AnyObject) {
    self.timeFilterSelected = (sender as UIButton).tag as MyTimeFilter
    self.close(true)
}

그렇게하면 오류가 발생합니다.

‘Int’는 ‘MyTimeFilter’로 변환 할 수 없습니다

(태그 속성을 사용하여) 내 접근 방식이 가장 좋은지 모르겠지만 어쨌든 내 앱의 다른 곳에서 이러한 종류의 캐스팅을 수행해야합니다. 누구 든지이 오류를 제거하는 방법에 대한 아이디어가 있습니까?

감사!



답변

rawValue이니셜 라이저 사용 : enums에 대해 자동으로 생성 된 이니셜 라이저 입니다.

self.timeFilterSelected = MyTimeFilter(rawValue: (sender as UIButton).tag)!

참조 : 스위프트는 언어 § 열거 프로그래밍


참고 :이 답변은 변경되었습니다. Swift의 이전 버전은 클래스 메소드 fromRaw()를 사용하여 원시 값을 열거 된 값으로 변환합니다.


답변

스위프트 5

@IBAction func selectFilter(sender: AnyObject) {
    timeFilterSelected = MyTimeFilter(rawValue: sender.tag)
 }


답변

Jeffery Thomas의 답변에 대해 자세히 설명합니다. 가드 문을 안전하게 배치하기 위해 캐스트를 사용하기 전에 랩 해제

   @IBAction func selectFilter(sender: AnyObject) {
     guard let filter = MyTimeFilter(rawValue: (sender as UIButton).tag) else {
        return
    }
        timeFilterSelected = filter
     }


답변