2014-09-30 14 views
7

Cho sau đây enum trong C# và một chuyển đổi/trường hợp để trả về màu đường viền của một hộp văn bản theo trạng thái của nó chẳng hạn.Kết hợp trường hợp mặc định với các trường hợp khác

enum TextboxState { 
Default, 
Error 
} 

switch(foo) { 
default: 
case TextboxState.Default: return Color.Black; 
case TextboxState.Error: return Color.Red; 
} 

Vì vậy, về cơ bản tôi xác định một thực và không chỉ bởi trạng thái mặc định ước aka TextboxState.Default bằng cách thêm các trường hợp default:. Tôi chỉ muốn làm điều này để ngăn chặn những thay đổi đột ngột trong tương lai nếu các giá trị mới được thêm vào enum.

Theo cuốn sách Swift này là không thể:

“Nếu nó không phải là thích hợp để cung cấp một trường hợp chuyển đổi cho mỗi giá trị có thể , bạn có thể xác định một nhận tất cả mặc định trường hợp để trang trải bất kỳ giá trị không được giải quyết một cách rõ ràng. nhận tất cả trường hợp này được chỉ định bởi mặc định từ khóa, và phải luôn luôn xuất hiện cuối cùng.”

Đoạn là khá rõ ràng về điều đó, vì vậy tôi giả định mô hình của tôi trên đây không áp dụng đối với Swift hay tôi bỏ lỡ một cái gì đó? Có cách nào khác để lưu trữ một cái gì đó giống như mã trên không?

Trả lời

11

Bạn có thể sử dụng fallthrough để làm điều đó, bằng cách di chuyển hành vi được chia sẻ trong trường hợp default và sử dụng fallthrough trong tất cả các trường hợp mà bạn muốn hành vi được chia sẻ xảy ra.

Ví dụ, nếu đây là enum của bạn (thêm một trường hợp thứ 3 để hiển thị nó có thể xử lý nhiều throughs mùa thu):

enum TextboxState { 
    case Default 
    case Error 
    case SomethingElse 
} 

bạn có thể định dạng báo cáo kết quả switch như sau:

switch(foo) { 
case TextboxState.Error: 
    return UIColor.redColor() 

case TextboxState.Default: 
    fallthrough 

case TextboxState.SomethingElse: 
    fallthrough 

default: 
    return UIColor.blackColor() 
} 

Mỗi fallthrough di chuyển điểm thực hiện sang trường hợp tiếp theo, lên tới trường hợp default.

+1

Để tham khảo, phần hướng dẫn được ghi lại trong phần chuyển đổi tại đây: https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/Swift_Programming_Language/Statements.html –

1

Xóa dòng default: khỏi số switch của bạn. Ngay cả khi bạn một ngày nào đó thêm các trường hợp bổ sung vào enum của bạn, trình biên dịch Swift sẽ khiếu nại nếu bạn không thêm các trường hợp tương ứng vào mỗi switch sử dụng enum. Và FYI, bạn không cần phải chỉ định TextboxState. trước các giá trị case trong switch, bởi vì trình biên dịch biết rằng fooTextboxState. Mã kết quả sẽ là:

switch(foo) { 
    case .Default: return Color.Black; 
    case .Error: return Color.Red; 
} 

mặc dù, cho nhất quán, tôi muốn đưa trường hợp .Error trước .Default một.

Các vấn đề liên quan