Swift - Truyền Int vào enum: Int


134

Tôi rất mới với Swift (đã bắt đầu trong tuần này) và tôi đang di chuyển ứng dụng của mình từ Objective-C. Về cơ bản, tôi có đoạn mã sau trong Objective-C hoạt động tốt:

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];
}

Khi dịch nó sang Swift, tôi đã làm như sau:

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)
}

Bằng cách đó, tôi nhận được lỗi:

'Int' không thể chuyển đổi thành 'MyTimeFilter'

Tôi không biết cách tiếp cận của mình (sử dụng thuộc tính thẻ) là tốt nhất, nhưng dù sao tôi cũng cần thực hiện kiểu đúc này ở những nơi khác nhau trong ứng dụng của mình. Có ai có ý tưởng làm thế nào để thoát khỏi lỗi này?

Cảm ơn!


2
Cũng lưu ý rằng thay vì (sender as UIButton), bạn chỉ có thể thay đổi chữ ký phương thức để UIButtonthay thế AnyObject.
Ben Leggiero

Câu trả lời:


240

Sử dụng trình rawValuekhởi tạo: đó là trình khởi tạo tự động được tạo cho enums.

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

xem: Ngôn ngữ lập trình Swift § Số lượng


LƯU Ý: Câu trả lời này đã thay đổi. Phiên bản trước của Swift sử dụng phương thức lớp fromRaw()để chuyển đổi giá trị thô thành giá trị liệt kê.


Cũng lưu ý rằng nếu thẻ của người gửi không tương ứng với giá trị enum, điều này sẽ gây ra sự cố do !.
Ben Leggiero

2
Tôi muốn nói rằng sự cố là cách tốt nhất để bắt lỗi trong trường hợp này.
XY

0

Swift 5

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

Bạn hoàn toàn không trả lời câu hỏi, thay vì bình luận rằng bạn không biết tại sao ai đó downvote, hãy kiểm tra câu hỏi và câu trả lời của bạn một lần nữa tại sao ai đó lại đánh giá thấp. Tôi cũng phải đánh giá thấp nó.
Renetik

0

xây dựng câu trả lời của Jeffery Thomas. để an toàn, hãy đặt một tuyên bố bảo vệ mở khóa các diễn viên trước khi sử dụng nó, điều này sẽ tránh sự cố

   @IBAction func selectFilter(sender: AnyObject) {
     guard let filter = MyTimeFilter(rawValue: (sender as UIButton).tag) else { 
        return
    }
        timeFilterSelected = filter
     }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.