2015-06-22 13 views
5
enum EnumType { 
    case WithString(String) 
} 

var enums = [EnumType]() 

enums.append(EnumType.WithString("A")) 
enums.append(EnumType.WithString("B")) 
enums.append(EnumType.WithString("C")) 
enums.append(EnumType.WithString("D")) 
enums.append(EnumType.WithString("E")) 
enums.append(EnumType.WithString("F")) 

Cách lọc mảng enums để tìm giá trị được liên kết bằng C. Tôi cần sử dụng những gì vị ngữ?Làm thế nào để tạo ra một vị từ để lọc mảng enums với các giá trị liên quan trong Swift?

+0

Mục đích của enum không có giá trị được liệt kê là gì? Bạn chỉ cần tạo một mảng/danh sách các phần tử String. Tuy nhiên, lọc một mảng là dễ dàng: hãy lọcArray = array.filter {$ 0 khớp với điều kiện} – ncerezo

+0

Tôi sẽ sử dụng nó trong một ví dụ phức tạp hơn :-) nhưng bản chất là trong ví dụ SIMPLEST –

+0

Ok :) xem câu trả lời của tôi – ncerezo

Trả lời

5

Chức năng lọc có thể được gọi là hàm toàn cục trên một mảng, hoặc như một phương thức thể hiện (tôi thích sau này vì nó là OO nhiều hơn).

Nó chấp nhận việc đóng bằng một tham số (phần tử được đánh giá) trả về một boolean (cho biết phần tử có khớp với điều kiện bắt buộc) hay không.

Vì đó là sự đóng cửa đơn giản trong một tình huống rõ ràng, bạn có thể sử dụng biểu mẫu viết tắt.

Tôi đoán rằng khác "Với" trường hợp sẽ được thêm vào enum của bạn, vì vậy bạn có thể đi với một cái gì đó như:

let filteredArray = enums.filter { 
    switch $0 { 
     case let .WithString(value): 
     return value == "C" 
     default: 
     return false 
    } 
} 

Điều đó sẽ làm các trick trong ví dụ của bạn.

+0

Không, nó không phải là lừa ... Nó không phải là ví dụ với 'rawValue'. –

+0

Bạn nói đúng, tôi đã chỉnh sửa câu trả lời. – ncerezo

+0

Tôi không nghĩ rằng bỏ phiếu xuống là xứng đáng mà không cho tôi thời gian để chỉnh sửa câu trả lời ;-) – ncerezo

0
var filteredArray = enums.filter { element in 
    switch element { 
    case EnumType.WithString(let string): 
     return string == "A" 
    default: 
     return false 
    } 
} 

này có lẽ có thể được đơn giản hóa với Swift 2.0 ràng buộc của các giá trị bộ được liên kết trong if báo cáo.

6

Như ai đó đã đề cập, cho Swift> 2.0 có nếu trường hợp tuyên bố sẵn:

enums.filter { 
    if case .WithString("C") = $0 { 
    return true 
    } 
    return false 
} 

Tuy nhiên, nó không giống tốt đẹp, đặc biệt là nếu bạn đang đi lặp lại cùng một logic một lần nữa. Những gì chúng ta có thể làm ở đây là để đảm EnumType phù hợp với Equatable:

extension EnumType: Equatable { 
} 

func ==(lhs: EnumType, rhs: EnumType) -> Bool { 
    switch (lhs, rhs) { 
    case (.WithString(let lStr), .WithString(let rStr)): 
     return lStr == rStr 
    } 
} 

Và bây giờ bạn có thể chỉ:

enums.filter { $0 == .WithString("C") } 
0

Bạn có thể thử thêm một phần mở rộng đơn giản với một tài sản tính đến enum của bạn và lọc để tài sản đó:

extension EnumType { 
    var isC: Bool { 
    switch self { 
    case .WithString(let message): return message == "C" 
    default: return false 
    } 
    } 
} 

Sau đó, bạn có thể sử dụng simpy lọc như bình thường:

enums.filter { $0.isC } 
Các vấn đề liên quan