2016-03-31 14 views
6

Theo dõi bài đăng trên blog tuyệt vời tại đây: https://appventure.me/2015/08/20/swift-pattern-matching-in-detail/#sec-3-7 Tôi đã thử đối sánh mẫu tùy chỉnh. Hãy xác định một enum đại diện cho hai loại chuỗi:Đối sánh mẫu tùy chỉnh trong Swift 2.2 không hoạt động như mong đợi

enum LineType : String { 
    case Event = "event:" 
    case Data = "data:" 
} 

Tiếp theo, một phần mở rộng String khả năng nói nếu một chuỗi bắt đầu với một hoặc các giá trị khác của LineType:

extension String { 
    func isOfType(type: LineType) -> Bool { 
     return self.hasPrefix(type.rawValue) 
    } 
} 

Sau đó, mô hình tùy chỉnh chức năng phù hợp, kiểm tra xem một chuỗi có thuộc một loại nhất định không:

func ~= (pattern: LineType, value: String) -> Bool { 
    return value.isOfType(pattern) 
} 

Cuối cùng, hãy thử nghiệm nó với examp này le:

let testLine = "event:yada-yada-yada" 

switch testLine { 
case _ where testLine.characters.count == 0: 
    print("Empty") 
case LineType.Event: // <--- Causes the error Enum case 'Event' is not a member of type 'String' 
    print("Event") 
case LineType.Data: // <--- Causes the error Enum case 'Data' is not a member of type 'String' 
    print("Data") 
default: 
    print("Unknown Type") 
} 

Vì vậy, nếu ai đó có thể cho tôi biết những gì tôi làm sai ...

Cảm ơn trước.

+2

Trông giống như một lỗi đối với tôi, nó không thể biên dịch nếu mẫu là kiểu liệt kê. –

+2

@MartinR case {LineType.Event}(): in ("Sự kiện") giải quyết sự cố ... hoặc xác định tốt hơn các hằng số cho e = LineType.Event; ... trường hợp e: ... – user3441734

Trả lời

2
switch testLine { 
case _ where testLine.characters.count == 0: 
    print("Empty") 
case _ where testLine.isOfType(.Event): print("Event") 
case _ where testLine.isOfType(.Data): print("Data") 
default: print("Unknown Type") 
} 

/* prints 
Event 
*/ 

vẫn còn, cố gắng sắp xếp lại nó ...

có vẻ khủng khiếp, nhưng hoạt động này, như mong đợi

enum LineType : String { 
    case Event = "event:" 
    case Data = "data:" 
} 
func ~= (pattern: LineType, value: String) -> Bool { 
    return value.hasPrefix(pattern.rawValue) 
} 


let testLine = "event:yada-yada-yada" 
let e = LineType.Event 
let d = LineType.Data 
switch testLine { 
case let s where s.characters.count == 0: print("Empty") 
case e: print("Event") 
case d: print("Data") 
default: print("Unknown Type") 
} 
/* prints 
Event 
*/ 

này cũng nên làm việc

... 
case { return LineType.Event }(): print("Event") 
... 

hoặc

... 
case { LineType.Event }(): print("Event") 
... 
+1

Cảm ơn, nhưng đây là những gì tôi cố gắng tránh. Bởi vì nó không phù hợp với mẫu tùy chỉnh. Nguyên tắc kết hợp mẫu tùy chỉnh là gọi hàm '~ =' trong 'trường hợp chuyển đổi' không ghi nó mỗi lần. Dù sao cũng cảm ơn bạn. – Zaphod

+0

@Zaphod xem cập nhật của tôi, mặc dù tôi không thấy bất kỳ lợi thế nào khi sử dụng toán tử tùy chỉnh ở đó – user3441734

+0

Thực tế toán tử '~ =' là toán tử liên quan đến khớp mẫu 'chuyển trường hợp'. Bạn không cần phải viết nó. Hãy xem liên kết ở đầu câu hỏi. – Zaphod

0

Đúng, không có giải pháp nào khác ngoài sử dụng .rawValue. Nhưng bạn đã biết cách làm điều đó.

Tôi đã thử nghiệm điều này trong một sân chơi (sử dụng Xcode 7.3) và tôi có thể xác nhận rằng điều này không hoạt động. Thêm public công cụ sửa đổi vào các chức năng liên quan cũng không giúp được gì. Tôi khuyên bạn nên gửi báo cáo lỗi tại số Apple Bug Reporter hoặc tốt hơn là Swift Bug Reporter (theo đề xuất của @OleBegemann).

+0

Nó có lẽ tốt hơn để nộp lỗi tại https://bugs.swift.org/. –

+0

@OleBegemann: Tôi đồng ý! Đã cập nhật câu trả lời của tôi. –

+0

Nhờ cả hai bạn. Cách giải quyết với {}() hoạt động nhưng như hành vi dự kiến ​​không, tôi sẽ báo cáo nó cho cả hai nền tảng. – Zaphod

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