2016-11-15 19 views
5

GÜNCELLEME Bu switch açıklamaya bir if-else taşırkenNeden girinti, Swift 3'teki bu anahtar deyiminde çalışmıyor?

Swift 3.1 düzeltilmiştir, o tür kesmesi çalışma değildi fark ettim. quantityTypeIdentifier zaten bu türde olduğunda her case'da neden HKQuantityTypeIdentifier belirtmem gerekiyor?

func process(samples: [HKSample]?, quantityTypeIdentifier: HKQuantityTypeIdentifier) { 
    DispatchQueue.main.async { [weak self] in    
     if let quantitySamples = samples as? [HKQuantitySample] { 
      for sample in quantitySamples { 
       switch quantityTypeIdentifier { 
       case HKQuantityTypeIdentifier.distanceWalkingRunning: 
        // code 

       case HKQuantityTypeIdentifier.activeEnergyBurned: 
        // code 

       case HKQuantityTypeIdentifier.heartRate: 
        // code 

       default: 
        fatalError("Quantity Type Identifier not implemented \(quantityTypeIdentifier)") 
       } 
      } 
     } 
    } 
} 

ben gibi işlevi çağırmak mümkün duyuyorum:

process(samples: samples, quantityTypeIdentifier: .distanceWalkingRunning) 
+1

'HKQuantityTypeIdentifier' enum türü değildir. Bu bir yapı. Muhtemelen sebebi budur. – vadian

+0

Ben Swift kitapta bir şey bulmak mümkün olmamıştır, ama bana öyle geliyor ki 'eğer quantityTypeIdentifier == .distanceWalkingRunning {}' eserler, daha sonra switch deyimi de bunu ele almak gerekir eğer. – jjatie

+0

Bu 'struct' Obj-C ile uyumluluk için bir “enum” olmasının sebebi midir? – jjatie

cevap

3

Ben Eğer bir hata buldum, ya da en azından bir tane iddia makul bir dava var. Tutarsızlık çok daha kısa bir örnekle gösterilmektedir:

let c : UIColor = .red 
switch c { 
case .red : print ("red") // error 
default : break 
} 

Bu, derlenmeyecektir. İlk satırda .red diyebilirsiniz, ancak üçüncü hatta değil. Bu açık bir tutarsızlık gibi görünüyor.

Şimdi, kurallar iki farklı yerlerde farklı neden ben kesinlikle açıklayabilirim, bu having. Bir case sentezleme ~= operatör ve bir desen oluşturan kurallarına göre çözümlenir. Bu kurallar Swift her şeyden farklıdır (dolayısıyla, örneğin, bir case desende as söylemek ama başka her yerde as? söyleyebilirim durumlar vardır). Öyle ki, bunun işe yaraması için düzeltmeye ihtiyaç duyan kurallar bunlar. Çıplak enum vakaları izin ama çıplak enum benzeri yapı "olgu" (yani, RawRepresentable olan yapılar statik üyeleri nerede bu statik üyeleri yapı kendisi örneğine değerlendirmek) değil gibi onlar bugüne kadar büküverildi. true açmadan ve desen eşleştirme ve yeniden giren sınırlarını kırmak tüm boolean durumunu dışarı yazarak

let c : UIColor = .red 
switch true { 
case c == .red : print ("red") // heh heh 
default : break 
} 

:

Son olarak, burada ben case desenler çok külfetli olunca kullanmak ister bir skanky geçici bir çözüm normal ifadelerin dünyası.