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


134

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'로 변환 할 수 없습니다

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

감사!


2
또한 대신 있습니다 (sender as UIButton), 당신은 단지에 걸릴하는 방법 서명을 변경할 수 있습니다 UIButton대신 AnyObject.
Ben Leggiero

답변:


240

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

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

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


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


또한 발신자의 태그가 열거 형 값과 일치하지 않으면 이로 인해 충돌이 발생합니다 !.
Ben Leggiero

2
이 경우 충돌이 버그를 잡는 가장 좋은 방법이라고 말하고 싶습니다.
XY

0

스위프트 5

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

당신은 왜 누군가가 다운 피트 팅했는지 왜 알지 못한다고 언급하는 대신 질문에 전혀 대답하지 않았습니다. 왜 누군가가 다운 피봇 팅했는지 질문과 답을 다시 확인하십시오.
Renetik

0

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

   @IBAction func selectFilter(sender: AnyObject) {
     guard let filter = MyTimeFilter(rawValue: (sender as UIButton).tag) else { 
        return
    }
        timeFilterSelected = filter
     }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.