2016-11-15 7 views
5

UPDATE이는 switch 문에 if-else 마이그레이션에서Swift 3의 switch 문에서 형식 유추가 작동하지 않는 이유는 무엇입니까?

스위프트 3.1에 고정되어, 그 형식 유추가 작동하지 않는 나타났습니다. quantityTypeIdentifier이 이미 해당 유형 인 경우 각 caseHKQuantityTypeIdentifier을 지정해야하는 이유는 무엇입니까?

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)") 
       } 
      } 
     } 
    } 
} 

내가 좋아하는 함수를 호출 할 수 있어요 :

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

'HKQuantityTypeIdentifier'는 열거 형이 아닙니다. 그것은 구조체입니다. 아마 그럴 것입니다. – vadian

+0

Swift 책에서 아무것도 찾을 수 없었지만,'quantityTypeIdentifier == .distanceWalkingRunning {}'이 작동하면 switch 문도이를 처리 할 수 ​​있어야합니다. – jjatie

+0

이'struct '가 Obj-C와의 호환성을위한'enum'이 아닌 이유는 무엇입니까? – jjatie

답변

3

난 당신이 버그를 발견했습니다, 또는 적어도 하나 항에 합리적인 경우를 생각한다. 불일치는 매우 짧은 예제로 잘 나타납니다.

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

컴파일되지 않습니다. 첫 번째 줄에는 .red을 말할 수 있지만 세 번째 줄에는 말할 수 없습니다. 그건 분명히 모순 된 것처럼 보입니다.

지금, 나는 두 개의 다른 장소에서 규칙이 다른 이유를 분명히 설명 할 수 있습니다. A case 표현식은 ~= 연산자와 패턴을 형성하는 규칙에 따라 해결됩니다. 이러한 규칙은 Swift의 다른 규칙과 다릅니다 (따라서 예를 들어, case 패턴으로 as라고 말하면서도 다른 곳에서는 as?이라고 말하기도합니다). 그래서 분명히 이러한 것들이 작동하기 위해서는 조정이 필요한 규칙입니다. 그것들은 맨 손으로 열거 된 경우를 허용하기 위해 조정되었지만 enum과 같은 구조체 "사례"(즉, 정적 멤버가 구조체 자체의 인스턴스로 평가되는 RawRepresentable 인 구조체의 정적 멤버)는 허용하지 않습니다. true에 스위칭 우리는 패턴 매칭과 다시 입력의 경계를 깰 전체 부울 조건을 작성하여

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

:

마지막으로, 여기에 내가 case 패턴이 너무 부담 될 때 사용할 싶어하는 Skanky의 해결 방법입니다 정상적인 표현의 세계.

관련 문제