2016-03-31 15 views
6

Mükemmel blog gönderisini buradan takip edin: https://appventure.me/2015/08/20/swift-pattern-matching-in-detail/#sec-3-7 Özel desen eşleştirmeyi denedim.Özel desen uyumu Swift içinde 2.2 beklendiği gibi çalışmıyor

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

Sonraki bir dize LineType biri ya da diğer değerle başlıyorsa anlatan yapabilen bir String uzantısı:: Sonra

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

özel deseni en bir enum dizeleri iki tür temsil tanımlayalım eşleştirme işlevi, bir dizenin verilen türde olup olmadığını denetleme:

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

Son olarak, bu örnekle test edelim 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") 
} 

Yani birisi ... Yanlış ne önceden

Teşekkür söyle eğer. Hala bunu yeniden düzenlemek için denemek

+2

Bana bir hata gibi görünüyor, desen bir numaralandırma türü ise derleme başarısız olur. –

+2

@MartinR case {LineType.Event}(): print ("Event") sorunu çözmek ... veya daha iyi sabitleri tanımlamak e = LineType.Event; ... case e: ... – user3441734

cevap

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 
*/ 

...

o korkunç görünüyor, ama aynı zamanda

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

veya

çalışması gerekir
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 
*/ 

bu

beklendiği gibi bu işleri
... 
case { LineType.Event }(): print("Event") 
... 
+1

Teşekkürler, ama bundan kaçınmaya çalışıyorum. Çünkü özel desen eşlemesi değil. Özel desen eşleştirme ilkesi, her zaman yazmamak için 'anahtar kutusundaki' ~ = işlevini çağırmaktır. Yine de teşekkürler. – Zaphod

+0

@Zaphod, özel operatör kullanmanın herhangi bir avantajını görmese de güncellememi görüyorum. – user3441734

+0

Aslında, '~ =' operatörü 'switch case' desen eşleştirmesinde yer alan işleç. Yazmaya gerek yok. Sorunun başında bağlantıya bir göz atın. – Zaphod

0

Evet, .rawValue'u kullanmaktan başka çözüm yok. Ama sen bunu nasıl yapacağını biliyorsun.

Bunu bir oyun alanında (Xcode 7.3 kullanarak) test ettim ve bunun işe yaramadığını doğrulayabilirim. İlgili işlevlere public değiştirici eklemek de işe yaramadı. Bir hata raporunu Apple Bug Reporter veya daha iyisi Swift Bug Reporter (@OleBegemann tarafından önerildiği gibi) dosyalamanızı öneririz.

+0

Hatayı dosyalamak muhtemelen https://bugs.swift.org/ adresinden daha iyidir. –

+0

@OleBegemann: Katılıyorum! Cevabımı güncelledi. –

+0

İkinize de teşekkürler. {}() Ile yapılan geçici çözüm, ancak beklenen davranış olmadığından, bunu her iki platformda da bildireceğim. – Zaphod

İlgili konular