2017-04-19 1 views
1

하나 이상의 평가 단락 회로가있는 switch 문을 수행합니까?스위프트 스위치 단락 마십시오?

아마도 문제가되지 않지만 궁금합니다.


다음은 간단한 예제 : 첫 번째 경우 문에서

let one = 1 
let two = true 
let three = false 


switch (one, two, three) { 
case let (0, b, c) where b==c: 
    break 

case (0, true, true): 
    break 

default: 
    break 
} 

는 '어디에'평가도됩니까?

두 번째 case 문에서 'two'== true가 발생합니까? 다음 코드로

답변

2

@ J. 비니의 대답은 당신의 첫 번째 질문을 멋지게 (그리고 설득력있게) 다룹니다. 처음 one0과 일치하지 않으므로 은 호출되지 않습니다. AND은 단락되었습니다.

두 번째 질문은 튜플의 경우 == 구현에 따라 달라집니다. a comment to this question에 따르면 2.2.1부터 Swift-language의 일부였으며 표준 구현은 단시간에 이루어 지므로 가장 빠른 작업입니다. 두 번째 경우에는 두 번째 요소가 비교되지 않습니다.

Btw : Swift switch 문에 break을 입력 할 필요가 없으면 원하는 경우 fallthrough이됩니다.

수정 : 내 생각에 절반 만 맞는 것으로 나타났습니다. switch의 패턴 일치가 예상 한 것보다 많은 것으로 보입니다. 나는 내 자신의 Bool 열거 (약 this post 다음 (그리고 스위프트 3)에 대한 조정)을 사용하여 ==를 납치 시도하고 몇 가지 놀라운 결과를 얻었다 :

import Cocoa 

let one = 1 
let two:MyBool = .myTrue 
let three:MyBool = .myFalse 
typealias ThreeTuple = (o:Int, tw:MyBool, th:MyBool) 
let tuple:ThreeTuple 
tuple = (one, two, three) 

switch tuple { 
case let (1, b, c) where b == c: 
    print("first case")  
case (1, .myTrue, .myFalse): 
    print("second case") 
default: 
    print("default") 
} 

enum MyBool : ExpressibleByBooleanLiteral, Equatable { 
    case myTrue, myFalse 
    public init() { self = .myFalse } 
    public init(booleanLiteral value: BooleanLiteralType) { 
     self=value ? .myTrue : .myFalse 
    } 
} 

func ==(lhs: MyBool, rhs: MyBool) -> Bool { 
    print("evaluate ==") 
    switch (lhs, rhs) { 
    case (.myTrue,.myTrue), (.myFalse,.myFalse): 
     return true 
    default: 
     return false 
    } 
} 

내가 majorly이었다 시점에서

evaluate == 
second case 

를 산출 놀랐다. MyBool 값의 경우 ==의 유일한 평가는 casewhere b == c 절에서 발생하며 모든 비교 튜플은 MyBool== 함수 을 전혀 사용하지 않습니다. !!나는 옵티마이 저는 컴파일시에 과도한 최적화를 배제해야 이는 func

func match(_ tuple:ThreeTuple) { 
    switch tuple { 
    case let (1, b, c) where b == c: 
     print("first case") 
    case (1, .myTrue, .myFalse): 
     print("second case") 
    default: 
     print("default") 
    } 
} 

로에 switch 살이 너무 방해했지만, 지금은

match((1, .myTrue, .myTrue)) 
match((1, .myTrue, .myFalse)) 
match((0, .myTrue, .myFalse)) 

를 요청할 때이

evaluate == 
first case 
evaluate == 
second case 
default 
을 얻을 의심

여기서 evaluate ==은 여전히 ​​첫 번째 case에서만 발생합니다. 그러므로 유일한 합리적인 결론은 switch 문에서 패턴 일치 중에 진행되는 "다른 마술"이있는 것으로 보입니다. 그게 뭔지 알아낼 수 있다면 구글로 가려고했지만 지금까지는 쓸모가 없습니다. 어떤 식 으로든, 내가 예상했던 것보다 더 단락이있는 것처럼 보입니다.

+0

두 번째 case 문이 단락되었음을 증명하기 위해 코드를 작성하는 것이 좋습니다. 그걸하는 방법을 알아 낸다. –

+0

@ J.beenie 당신 말이 맞습니다. 다른 어떤 일이있는 것 같습니다. 패턴 매칭은 Swift에서 * 실제로 최적화 된 것 같습니다. 이것에 관해 밝혀 줄 수있는 사람이 있는지 살펴 봅니다. – Patru

1

테스트 질문 : 놀이터

에서

let one = 1 
let two = true 
let three = false 


switch (one, two, three) { 
case let (0, b, c) where b - c: 
    break 

case (0, true, true): 
    break 

default: 
    break 
} 

extension Bool{ 
    static func - (lhs: Bool, rhs: Bool) -> Bool { 
     print("foo") 
     return lhs == rhs 

    } 
} 

단지 1 첫 번째 공을 변경하고 어떻게되는지.

대답은 예입니다;) 그것은 단락합니다.

관련 문제