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
이니셜 라이저 사용 : enum
s에 대해 자동으로 생성 된 이니셜 라이저 입니다.
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
}