2016-12-16 25 views
5

Lưu ý rằng tôi đã đọc số post nhưng bài đăng đó sử dụng câu lệnh chuyển đổi và nó được cho là làm điều gì đó (trả về true) khi mẫu phù hợp. Tôi, mặt khác, không muốn làm bất cứ điều gì nếu mô hình phù hợp và sử dụng một tuyên bố nếu trường hợp.Làm thế nào để kiểm tra nếu enum không phù hợp với một mô hình?

Tôi có enum này:

enum MyEnum { 
    case a 
    case b(Int) 
    case c 
    case d 
} 

Dưới đây là một thể hiện của nó:

let myEnum: MyEnum = .a 

Bây giờ tôi muốn làm điều gì đó nếu không phải là myEnum.b. Kể từ .b có giá trị liên quan, tôi không thể chỉ cần sử dụng một nếu kiểm tra tuyên bố:

if myEnum != .b { // compiler error 
    // do my thing here 
} 

Vì vậy, tôi phải sử dụng một tuyên bố nếu hợp cụ thể để mô hình phù hợp với nó:

if case .b(_) = myEnum { 

} else { 
    // do my thing here 
} 

Nhưng tôi thực sự ghét việc sử dụng mệnh đề if rỗng. Điều đó có vẻ không hợp lý với tôi. Tôi đã cố gắng làm điều này một cách ngây thơ:

if case .b(_) != myEnum { // compiler error! 
    // do my thing here 
} 

Có cách nào tốt hơn để thực hiện điều này ngoài việc sử dụng mệnh đề if trống không?

Tôi vẫn có mã sẽ chạy bất kể mẫu có khớp hay không, do đó, câu lệnh guard sẽ không hoạt động.

Trả lời

8

Đây hoàn toàn là sự thay đổi ngữ nghĩa tối thiểu của mã riêng của bạn, nhưng lưu ý rằng bạn chỉ có thể "loại bỏ" các inline if khoản trống với các khớp case mẫu:

if case .b(_) = myEnum {} else { 
    // do your thing here 
} 

hay, để lại ra phù hợp với mô hình dự phòng cho giá trị liên quan đến các trường hợp b:

if case .b = myEnum {} else { 
    // do your thing here 
} 

này trông hơi giống như một khoản guard, nhưng mà không thoát khỏi phạm vi.

3

Bạn có thể sử dụng một guard:

guard case .b = myEnum else { 
    // do your stuff here 
    return 
} 

Nhược điểm là bạn phải thoát khỏi phạm vi ...

+0

Xin lỗi, nhưng tôi nhận ra rằng tôi đã không cung cấp đủ ngữ cảnh. Mã của tôi không thể trở lại sau đó. Có một số mã cần được thực hiện cho dù mẫu có khớp hay không. Tuy nhiên, bạn xứng đáng là một upvote! – Sweeper

+0

@Sweeper vâng, nghĩ về điều đó sau khi tôi đăng câu trả lời, vì vậy tôi đã thêm một lưu ý về điều này :) – Cristik

+0

tại sao không sử dụng một hàm hoặc thuộc tính được tính toán trả về trạng thái của enum (switch). – Dasem

1

Bạn có thể viết một tài sản tính toán và có nó trả về một giá trị bool tùy thuộc vào trường hợp

enum MyEnum { 
    case a 
    case b(Int) 
    case c 

var isCaseB: Bool { 
    switch self { 
     case .b(_): 
     return true 
     default: 
     return false 
     } 
    } 
} 

sau đó trong mã của bạn sạch sẽ kiểm tra:

if !enumVal.isCaseB { 

} 

Tôi đã kiểm tra câu trả lời bạn đã đề cập trong câu hỏi nhưng tôi không chắc liệu bạn có muốn không sử dụng câu lệnh chuyển đổi hay chỉ là bạn không muốn kết hợp với mã khác của mình . Tôi nghĩ rằng đây là một cách tốt đẹp và sạch sẽ để kiểm tra trước khi viết bất cứ điều gì thực hiện bạn cần phải làm tùy thuộc vào vụ án.

1

gì về:

switch myEnum { 
case .b(_): 
    break 
default: 
    // do your thing here 
} 
+0

Không cần bao gồm '(_)' trong kết hợp mẫu. – Hamish

1

Tạo một var trên enum mà tính toán nếu giá trị của bạn không phải là .b(_):

enum MyEnum { 

    case a 
    case b(Int) 
    case c 
    case d 

    var notB: Bool { 
     switch self { 
     case .b(_): 
      return false 
     default: 
      return true 
     } 
    } 
} 

MyEnum.a.notB // true 
MyEnum.b(1).notB // false 
MyEnum.c // true 
MyEnum.d // true 

Không phải là câu trả lời lớn nhất kể từ khi vẫn còn rất nhiều mã để làm kiểm tra, nhưng ít nhất kiểm tra chỉ là một dòng khi bạn thực sự sử dụng nó.

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